WPF: работа с изображениями - PullRequest
3 голосов
/ 25 апреля 2011

Я хочу создать следующую функциональность: я хочу иметь возможность показывать изображение в окне, если оно предусмотрено, или кисть с линейным градиентом, если изображение отсутствует.Я предложил два подхода:

  1. Чтобы создать Border и применить ImageBrush к свойству border Background, если указано изображение Uri, или LinearGradientBrush если не.Это легко реализовать: модель представления будет предоставлять свойство фона границы либо кистью изображения, либо кистью линейного градиента.Но есть одна большая проблема: если размеры изображения не соответствуют размеру границы, изображение деформируется, чего я хотел бы избежать.Есть ли способ установить ImageBrush и сохранить соотношение размеров изображения, т.е. применить что-то вроде Stretch = Stretch.Uniform?

  2. Для создания 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>
    

Каков наилучший и самый простой способ реализации такой функциональности?Спасибо.

1 Ответ

1 голос
/ 25 апреля 2011

ImageBrush является производным от класса TileBrush, который имеет свойство Stretch.Таким образом, вы можете использовать не что-то вроде Stretch = Stretch.Uniform, а именно это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...