Я хочу создать следующую функциональность: я хочу иметь возможность показывать изображение в окне, если оно предусмотрено, или кисть с линейным градиентом, если изображение отсутствует.Я предложил два подхода:
Чтобы создать Border
и применить ImageBrush
к свойству border Background
, если указано изображение Uri
, или LinearGradientBrush
если не.Это легко реализовать: модель представления будет предоставлять свойство фона границы либо кистью изображения, либо кистью линейного градиента.Но есть одна большая проблема: если размеры изображения не соответствуют размеру границы, изображение деформируется, чего я хотел бы избежать.Есть ли способ установить ImageBrush
и сохранить соотношение размеров изображения, т.е. применить что-то вроде Stretch = Stretch.Uniform
?
Для создания Border
и Image
внутриэтогоЗатем, чтобы создать триггер данных для границы, и если изображение Uri
(свойство модели представления) имеет значение null
, установить Background
границы на LinearGradientBrush
и оставить его пустым, еслииначе.Я пытался создать это, но триггер данных никогда не понимал случай null
.Существует также проблема с Image
, потому что если для свойства ImageSource
указано null
, возникает исключение.Код выглядит следующим образом:
<Border Width="130" Height="170">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding Image}" Value="{x:Null}">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#696969" Offset="0.0" />
<GradientStop Color="#2E2E2E" Offset="1.0" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Image Name="image" Stretch="Uniform">
<Image.Source>
<BitmapImage
DecodePixelWidth="{Binding ElementName=image, Path=Width}"
UriSource="{Binding Path=Image}" />
</Image.Source>
</Image>
</Border>
Каков наилучший и самый простой способ реализации такой функциональности?Спасибо.