首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Converter引用xaml模板?

如何从Converter引用xaml模板?
EN

Stack Overflow用户
提问于 2011-01-19 04:42:26
回答 5查看 3.2K关注 0票数 0

我现在遇到了一个问题,通过一个转换器将不同的模板分配给一个控件。

所以我有2个模板。

代码语言:javascript
复制
        <ControlTemplate x:Name="_templateA" x:Key="templateA">
            <StackPanel Grid.Column="0" Margin="0,0,5,0">
                <Blah />
            </StackPanel>
        </ControlTemplate>

        <ControlTemplate x:Name="_templateB" x:Key="templateB">
            <StackPanel Grid.Column="0" Margin="0,0,5,0">
                <Blah Blah />
            </StackPanel>
        </ControlTemplate>

我使用这个转换器实现了这个控制:

代码语言:javascript
复制
<ControlA x:Name="_controlA" >
     <Control Template="{Binding Converter={StaticResource templateConverters}}" />
</ControlA>

我的转换器:

代码语言:javascript
复制
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Object a;
        ControlTemplate template = null;

        try
        {
            a= value as ObjectA;
            if (value != null)
                template = a.useTemplate1 ? [templateA from xaml] : [templateB from xaml];
        }
        catch (Exception ex)
        {
            Debug.Assert(false, ex.ToString());
        }

        return toolbar;
    }

在我的Converter中,我如何才能获得对xaml文件的引用,以便它允许我为其分配所需的模板?

谢谢和问候,凯文

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-19 04:56:11

也许你应该考虑一些其他的实现,但这是你所要求的:

您的转换器代码:

代码语言:javascript
复制
public class MyConverter : IValueConverter
{
    public ControlTemplate TemplateA { get; set; }
    public ControlTemplate TemplateB { get; set; }

    ... Convert methods using TemplateA and TemplateB properties...
}

XAML中的用法:

代码语言:javascript
复制
<UserControl.Resources>
    <!-- templates with 'templateA' and 'templateB' keys -->
    <Converters:MyConverter x:Key="templateConverters" TemplateA="{StaticResource templateA}" TemplateB="{StaticResource templateB}" />
<UserControl.Resources>

...

<ControlA x:Name="_controlA" >
    <Control Template="{Binding Converter={StaticResource templateConverters}}" />
</ControlA>
票数 10
EN

Stack Overflow用户

发布于 2011-01-19 05:06:23

您正在尝试完成的操作称为模板选择器。你可以阅读它,例如,这里:http://codingbandit.com/Blog/blog/wpf-data-templates-part-4-template-selectors/

鉴于此,您将定义一个模板选择器(请参见控件上的ContentTemplateSelector属性)。它的SelectTemplate方法看起来像这样:

代码语言:javascript
复制
public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
    ControlTemplate template = null;
    ContentPresenter pres = container as ContentPresenter;

    try
    {
        if (value != null)
            template = item.useTemplate1 ? pres.FindResource("_templateA") : pres.FindResource("_templateB");
    }
    catch (Exception ex)
    {
        Debug.Assert(false, ex.ToString());
    }

    return toolbar;
}

更新:对不起,我忽略了你正在尝试获取一个ControlTemplate,而模板选择器是用来选择一个DataTemplate的。但我相信你的任务也可以使用数据模板来实现。

如果你仍然想使用ControlTemplate,那么触发器就是最好的选择:

代码语言:javascript
复制
<ControlTemplate x:Name="_templateA" x:Key="templateA">
    <StackPanel Grid.Column="0" Margin="0,0,5,0">
        <Blah />
    </StackPanel>
</ControlTemplate>

<ControlTemplate x:Name="_templateB" x:Key="templateB">
    <StackPanel Grid.Column="0" Margin="0,0,5,0">
        <Blah Blah />
    </StackPanel>
</ControlTemplate>

<Style x:Key="MyControlStyle" TargetType="[x:Type Control}">
   <Setter Property="Template" Value="{StaticResource templateB}"/>
   <Style.Triggers>
       <DataTrigger Binding="{Binding useTemplate1}" Value="True">
           <Setter Property="Template" Value="{StaticResource templateA}"/>
       </DataTrigger>
   </Style.Triggers>
</Style>

你可以控制:

代码语言:javascript
复制
<ControlA x:Name="_controlA" >
     <Control Style="{StaticResource MyControlStyle}" />
</ControlA>
票数 1
EN

Stack Overflow用户

发布于 2011-01-19 04:49:04

把你的模板放在一些控件的资源中,给它们x:Keys,然后调用:

代码语言:javascript
复制
ControlTemplate template = someControl.FindResource("Key") as ControlTemplate;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4728803

复制
相关文章

相似问题

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