我真的对ContentPresenter感到困惑。
我想构建一个转换器,它具有输入资源名称并返回包含该资源的新实例的新ContentPresenter。 似乎是显而易见的,但是当我在xaml中应用它时,内容将......在使用它的地方之间跳转:
转换器:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return null;
var key = value.ToString();
var control = new ContentPresenter();
control.SetResourceReference(ContentPresenter.ContentProperty, key);
return control;
}
它需要一个包含资源名称的字符串,并返回带有此资源的新ContentPresenter。
在xaml中我使用了两次:
<Window.Resources>
<Button x:Key="TestButton" Height="20" Width="30" Content="test"/>
<local:SelectResourceConverter x:Key="SelectResourceConverter" />
</Window.Resources>
<StackPanel>
<Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" />
<Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" />
</StackPanel>
'Resource'属性在后面的代码中定义:
public Window1()
{
InitializeComponent();
DataContext = this;
}
public string Resource
{
get { return "TestButton"; }
}
将ContentPresenter更改为ContentControl会在转换器中给出一个例外,即该元素已在可视树中。这给了我一个线索,SetResourceReference()返回两次相同的实例,但我不知道如何更改代码以帮助。
非常感谢您的帮助。
答案 0 :(得分:2)
这听起来像是想要使用DataTemplate的场景。
在转换器中设置ContentTemplateProperty:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return null;
var key = value.ToString();
var control = new ContentPresenter();
control.SetResourceReference(ContentPresenter.ContentTemplateProperty, key);
return control;
}
在XAML中,定义一个DataTemplate“TestButton”:
<Window.Resources>
<DataTemplate x:Key="TestButton">
<Button Height="20" Width="30" Content="test"/>
</DataTemplate>
<local:SelectResourceConverter x:Key="SelectResourceConverter" />
</Window.Resources>
<StackPanel>
<Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" />
<Button Height="100" Content="{Binding Resource, Converter={StaticResource SelectResourceConverter}}" />
</StackPanel>
如果我没有忘记什么,这应该就够了。通过DataTemplate
,您将为Converter创建的每个ContentPresenter
获取一个新的Button实例。
你确实知道你的代码中有一个按钮吗?不知道你为什么要这样......