2015-09-29 4 views
0

программно У меня есть ресурс, определенный в словаре ресурсов, который выглядит следующим образом:Как изменить изображение в сеттер Значение в Windows Phone

<x:Int32 x:Key="HubSectionHeaderCharacterSpacing">-10</x:Int32> 
<x:Double x:Key="HubSectionHeaderFontSize">19</x:Double> 
<Thickness x:Key="HubSectionHeaderMarginThickness">-1,5,0,31.5</Thickness> 
<Thickness x:Key="HubSectionMarginThickness">19,0,0,0</Thickness> 
<Style x:Key="MainMenuHubSectionStyle2" TargetType="HubSection"> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="HubSection"> 
       <Grid Background="WhiteSmoke"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="80"/> 
         <RowDefinition Height="*"/> 
        </Grid.RowDefinitions> 
        <Grid.RenderTransform> 
         <CompositeTransform x:Name="WrappingTransform"/> 
        </Grid.RenderTransform> 
        <Viewbox HorizontalAlignment="Center" Margin="0"> 
         <Image Source="ms-appx:///Assets/Logos/Logo.png" Stretch="Fill"/> 
        </Viewbox> 
        <ContentPresenter x:Name="ContentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="0" Grid.Row="1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

И у меня есть HubSection, который использует этот стиль. Как программно получить доступ к этому ресурсу и заменить

<Viewbox HorizontalAlignment="Center" Margin="0"> 
    <Image Source="ms-appx:///Assets/Logos/Logo.png" Stretch="Fill"/> 
</Viewbox> 

с другим изображением?

+0

Почему вы не можете просто привязать свойство string и изменить его во время выполнения? – RenDishen

+0

Потому что я не знаю, как это сделать. Я не использую MVVM, поэтому, где положить это свойство строки (и какого типа это должно быть, «ImageSource»?) –

ответ

0

Это грязный хак, но так как у вас есть только одно свойство для замены, вы можете воспользоваться Tag недвижимости для хранения URL изображения:

<Style x:Key="MainMenuHubSectionStyle2" TargetType="HubSection"> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="HubSection"> 
       <Grid Background="WhiteSmoke"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="80"/> 
         <RowDefinition Height="*"/> 
        </Grid.RowDefinitions> 
        <Grid.RenderTransform> 
         <CompositeTransform x:Name="WrappingTransform"/> 
        </Grid.RenderTransform> 
        <Viewbox HorizontalAlignment="Center" Margin="0"> 
         <Image Source="{TemplateBinding Tag}" Stretch="Fill"/> 
        </Viewbox> 
        <ContentPresenter x:Name="ContentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="0" Grid.Row="1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Затем вы можете использовать его как это:

<HubSection Tag="ms-appx:///Assets/Logos/Logo.png"> 
</HubSection> 

В противном случае вам, вероятно, придется создать свой собственный тип, наследующий от HubSection и добавляющий необходимые свойства.

В качестве альтернативы, вы можете использовать хорошую привязку ol, как было предложено RenDishen. Например:

<Style x:Key="MainMenuHubSectionStyle2" TargetType="HubSection"> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="HubSection"> 
       <Grid Background="WhiteSmoke"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="80"/> 
         <RowDefinition Height="*"/> 
        </Grid.RowDefinitions> 
        <Grid.RenderTransform> 
         <CompositeTransform x:Name="WrappingTransform"/> 
        </Grid.RenderTransform> 
        <Viewbox HorizontalAlignment="Center" Margin="0"> 
         <Image Source="{Binding Path=Logo}" Stretch="Fill"/> 
        </Viewbox> 
        <ContentPresenter x:Name="ContentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="0" Grid.Row="1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Тогда вы должны присвоить DataContext свойство вашего HubSection объекта, который имеет свойство Logo, и заполнить его соответствующим образом.