控件模板中引用控件内部的控件

5
如何在代码后台中的构造函数中获取下面XAML中OuterBorder控件的引用?
<Window Template="{DynamicResource WindowTemplate}">
    <Window.Resources>      
        <ControlTemplate x:Key="WindowTemplate" TargetType="{x:Type Window}">
            <AdornerDecorator>
                <Border Name="OuterBorder" Background="Black" BorderBrush="Red" BorderThickness="1" CornerRadius="0">
                    <!-- Implementation here... -->
                </Border>
            </AdornerDecorator>
        </ControlTemplate>
    </Window.Resources>
</Window>
2个回答

4

两种可能的解决方案:

解决方案1

在XAML中放置一个Loaded事件

<Border Name="OuterBorder" Loaded="Border_Loaded" ...

并在代码后端将其存储在私有字段中:

private Border border;

void Border_Loaded(object sender, RoutedEventArgs e)
{
    this.border = (Border)sender;
}

或者:

解决方案2

重写窗口的OnApplyTemplate方法:

private Border border;

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    this.border = (Border) Template.FindName("OuterBorder", this);
}

你的第二个解决方案对我很有帮助。谢谢! - Kenneth Kryger Sørensen

1

你可能需要重新考虑你的方法。你想要做什么?

通常情况下,你不应该想要或需要从你的代码后台访问ControlTemplate的部分,因为你的模板只是一个模板。它是控件的外观。你希望你的代码后台通常影响控件的行为

例如,如果你试图在某些交互情况下影响边框的颜色,你真正想要添加一些(.Net4之前)触发器或(.Net4之后)VisualStateManager到你的控件模板中来管理你的控件的视觉状态。


我同意这是一种“按照书本”的方式来做。然而,我必须在代码后台中创建一个adorner并设置绑定到它,所以“Acturus”的第二个解决方案是实现这个任务的正确(也是最快)方式。 - Kenneth Kryger Sørensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接