Да, это возможно, и ваша догадка верна.Поиск ресурса начинается с логического дерева, и создание нового FrameworkElement()
не удовлетворяет этому.Он полностью отключен.
Что вы можете сделать (и что вам, возможно, придется сделать, если предложение N8 не сработает), это передать конвертеру ссылку на UserControl
как FrameworkElement
для вызоваFindResource()
вкл.
Причина, по которой предложение N8, вероятно, не сработает, заключается в том, что Application.Current.FindResource()
, вероятно, начинается с ресурсов уровня приложения, а затем переходит к системным ресурсам, но ресурсы, которые вы ищете, находятся в UserControl
ресурсы.Если бы они были помещены в ресурсы App.xaml, это сработало бы.Тем не менее, я думаю, что Application.Current
может быть null
во время разработки.
Самый простой способ, которым я могу придумать, это сделать в конструкторе UserControl
:
public MyUserControl(){
var boolconv = new BoolConverter();
boolconv.FrameworkElement = this;
this.Resources.Add( "BoolConverter", boolconv );
InitializeComponent();
}
Я уверен, что это происходит до InitializeComponent()
, а не после.
Выполнение этого в XAML будет более сложным, так как вам, вероятно, придется добавить DependencyProperty
в ваш конвертер, чтобы вы моглипривязать UserControl
к нему.Я думаю, что это будет за бортом.
Другой способ - добавить свойства TrueBrush
и FalseBrush
в ваш конвертер и назначить их в XAML, что я и делаю, чтобы мои конвертеры были расплывчатыми иобщее использование.(Примечание: имена немного отличаются.)
<config:BoolToBrushConverter x:Key="Bool2Brush"
TrueBrush="{StaticResource OKStatusBrush}"
FalseBrush="{StaticResource ErrorStatusBrush}" />