我现在遇到了一个问题,通过一个转换器将不同的模板分配给一个控件。
所以我有2个模板。
<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>我使用这个转换器实现了这个控制:
<ControlA x:Name="_controlA" >
<Control Template="{Binding Converter={StaticResource templateConverters}}" />
</ControlA>我的转换器:
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文件的引用,以便它允许我为其分配所需的模板?
谢谢和问候,凯文
发布于 2011-01-19 04:56:11
也许你应该考虑一些其他的实现,但这是你所要求的:
您的转换器代码:
public class MyConverter : IValueConverter
{
public ControlTemplate TemplateA { get; set; }
public ControlTemplate TemplateB { get; set; }
... Convert methods using TemplateA and TemplateB properties...
}XAML中的用法:
<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>发布于 2011-01-19 05:06:23
您正在尝试完成的操作称为模板选择器。你可以阅读它,例如,这里:http://codingbandit.com/Blog/blog/wpf-data-templates-part-4-template-selectors/
鉴于此,您将定义一个模板选择器(请参见控件上的ContentTemplateSelector属性)。它的SelectTemplate方法看起来像这样:
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,那么触发器就是最好的选择:
<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>你可以控制:
<ControlA x:Name="_controlA" >
<Control Style="{StaticResource MyControlStyle}" />
</ControlA>发布于 2011-01-19 04:49:04
把你的模板放在一些控件的资源中,给它们x:Keys,然后调用:
ControlTemplate template = someControl.FindResource("Key") as ControlTemplate;https://stackoverflow.com/questions/4728803
复制相似问题