首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >资源字典GetTemplateChild中的wpf viewport3d返回null

资源字典GetTemplateChild中的wpf viewport3d返回null
EN

Stack Overflow用户
提问于 2014-12-11 15:27:19
回答 1查看 315关注 0票数 0

我已经将我的所有模型添加为资源字典作为控件模板,我可以使用以下代码加载它

代码语言:javascript
运行
复制
 <Control Name="control" Width="507" Height="309" Template="{StaticResource SkeletonModel}"

现在我想在运行时编辑这个模型,所以我试图让加载到控件元素中的viewport3d在运行时编辑它,而我不能对它使用触发器,所以我必须获得对它的引用,然后从后面的代码中操作它。这是我尝试过的代码

代码语言:javascript
运行
复制
  public partial class MainWindow : Window
    {
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            Viewport3D v = this.GetTemplateChild("ModelView") as Viewport3D;

        }

        public MainWindow()
        {
            InitializeComponent();
        }
    } 

V is always = null我还尝试将静态资源更改为动态资源,但不起作用。我还尝试了其他几种方法,如

代码语言:javascript
运行
复制
Viewport3D v = control.Template.LoadContent() as Viewport3D;
            ModelVisual3D model;

            model = FindName("SkeletonHumanModel") as ModelVisual3D;

这会加载视口和模型,但当我编辑它们中的任何一个时,它都不会被编辑,所以我猜loadcontent只是加载了一个副本或另一个实例,而不是窗口中使用的当前实例这里是资源字典

代码语言:javascript
运行
复制
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                    mc:Ignorable="d"

    >
    <!--x:Class="Dynamic.ModelOperations"
                     x:ClassModifier="public"-->
    <ControlTemplate x:Key="SkeletonModel" >

        <Viewport3D Width="500" Height="500"  x:Name="ModelView"  ClipToBounds="True" >

            <Viewport3D.Camera>
                <PerspectiveCamera FieldOfView="35" FarPlaneDistance="110.57139405398024" LookDirection="0,0,-38.5951803220261" NearPlaneDistance="0.1" Position="-16.3927650451661,9.1631622056011,38.1892213715065" UpDirection="0,1,0"/>
            </Viewport3D.Camera>
            <ModelVisual3D x:Name="World">
                <ModelVisual3D x:Name="AmbientLightContainer">
                    <ModelVisual3D.Content>
                        <AmbientLight x:Name="AmbientLight" Color="#FF7F7F7F"/>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D x:Name="DirectionalLightContainer">
                    <ModelVisual3D.Content>
                        <DirectionalLight x:Name="DirectionalLight" Color="#FF3F3F3F" Direction="0,0,-1">
                            <DirectionalLight.Transform>
                                <TranslateTransform3D OffsetZ="3" OffsetX="0" OffsetY="0"/>
                            </DirectionalLight.Transform>
                        </DirectionalLight>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D x:Name="SkeletonHumanModel"   >.....

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2014-12-11 15:35:01

要从ResourceDictionary获取资源,应该使用FindResource()方法。如果您的资源字典合并到App resources中,则可以从MainWindow获取资源,如下所示:

代码语言:javascript
运行
复制
private void OnLoaded(object sender, RoutedEventArgs e)
{
    var item = this.FindResource("SkeletonModel") as Viewport3D;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27417453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档