【问题标题】:WPF: Find Resources from UserControl within DataTemplateSelector classWPF:从 DataTemplateSelector 类中的 UserControl 中查找资源
【发布时间】:2013-01-15 13:22:29
【问题描述】:

我知道有这个帖子:How to find a resource in a UserControl from a DataTemplateSelector class in WPF?

问同样的问题。

但是...我对答案不满意!必须有一种方法来获取资源的

包含声明此内容的 ContentControl/Presenter 的用户控件:

ContentTemplateSelector="{StaticResource MySelector}" 

每个派生的DataTemplateSelector类在其SelectedTemplate方法中都有一个参数=>

容器类型为 DependencyObject。

容器在我的例子中就是 contentcontrol。

难道不能从“contentcontrol”开始爬上可视化树并尝试 通过 FindAncestor 获取 UserControl ?

【问题讨论】:

    标签: wpf user-controls resources datatemplateselector


    【解决方案1】:

    是的,您可以将container 参数转换为FrameworkElement 并调用FindResource 以从ContentPresenter 开始进行资源查找。例如:

    代码:

    public class MySelector
        : DataTemplateSelector
    {
        public override DataTemplate SelectTemplate
            (object item, DependencyObject container)
        {
            // Determine the resource key to use
            var key = item.ToString() == "a" ? "one" : "two";
            // Find the resource starting from the container
            return ((FrameworkElement)container).FindResource(key) as DataTemplate;
        }
    }
    

    XAML:

    <UserControl
        x:Class="WpfApplication1.UserControl1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        >
        <UserControl.Resources>
            <DataTemplate x:Key="one">
                <TextBlock>Template One</TextBlock>
            </DataTemplate>
            <DataTemplate x:Key="two">
                <TextBlock>Template Two</TextBlock>
            </DataTemplate>
            <local:MySelector x:Key="MySelector"/>
        </UserControl.Resources>
        <StackPanel>
            <ContentPresenter
                ContentTemplateSelector="{StaticResource MySelector}"
                Content="a"/>
            <ContentPresenter
                ContentTemplateSelector="{StaticResource MySelector}"
                Content="b"/>
        </StackPanel>
    </UserControl>
    

    【讨论】:

    • 有效!!!我把你的解决方案也放在了另一个错误解决方案的线程中,所以也许你会得到更多的分数;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多