Я действительно запутался с 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 () возвращает дважды один и тот же экземпляр, но я не знаю, как изменить код, чтобы помочь.
Ваша помощь будет очень признательна.