【问题标题】:Reference to control inside a ControlTemplate引用 ControlTemplate 中的控件
【发布时间】:2010-06-23 10:36:22
【问题描述】:

如何在代码隐藏中形成我的构造函数,以获取对下面 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>

【问题讨论】:

    标签: c# wpf resources controltemplate


    【解决方案1】:

    两种可能的解决方案:

    解决方案 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);
    }
    

    【讨论】:

    • 您的解决方案编号。 2 为我完成了这项工作。谢谢!
    【解决方案2】:

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

    通常,您不应该或不需要从代码隐藏中访问 ControlTemplate 的部分内容,因为您的模板就是这样——一个模板。这是控件的外观。您希望您的代码隐藏通常影响控件的行为

    例如,如果您想在某些交互情况下影响代码隐藏中的边框颜色,您确实想添加一些(.Net4 之前)触发器或(.Net4 之后)VisualStateManager 到您的控件模板为您管理控件的视觉状态。

    【讨论】:

    • 我同意这将是“按部就班”的方式。但是,我必须在代码隐藏中创建一个装饰器并设置一个绑定到这个,所以这里的“Acturus”解决方案没有。 2 是实现这一目标的正确(也是最快)方式。
    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多