2015-02-13 7 views
0

Вот пользовательский стиль:XamlWriter скачет "х: Name" атрибут при сохранении ResourceDictionary

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Focusable" Value="false" /> 
    <Setter Property="Background" Value="{StaticResource AppBackBrush}"/> 
    <Setter Property="Foreground" Value="{StaticResource AppBrush}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Border BorderBrush="{StaticResource AppBrush}" 
         Name="content" 
         BorderThickness="1" 
         CornerRadius="3" 
         Background="{StaticResource AppBackBrush}" 
         > 
        <Grid Background="Transparent"> 
         <Label Content="{TemplateBinding Content}" 
           HorizontalContentAlignment="Center" 
           VerticalContentAlignment="Center" 
           Grid.Row="0" Grid.Column="0" 
           Background="Transparent" 
           Style="{x:Null}" 
           Foreground="{TemplateBinding Foreground}" 
           Padding="{TemplateBinding Padding}"/> 
        </Grid> 
        <Border.RenderTransform> 
         <!-- push the content a bit to the left and the top --> 
         <TranslateTransform x:Name="translation" 
              X="-1" Y="-1"/> 
        </Border.RenderTransform> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Trigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation Duration="0:0:0" 
                To="0" 
                Storyboard.TargetName="translation" 
                Storyboard.TargetProperty="(TranslateTransform.X)"/> 
            <DoubleAnimation Duration="0:0:0" 
                To="0" 
                Storyboard.TargetName="translation" 
                Storyboard.TargetProperty="(TranslateTransform.Y)"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.EnterActions> 
         <Trigger.ExitActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation Duration="0:0:0" 
                To="-1" 
                Storyboard.TargetName="translation" 
                Storyboard.TargetProperty="(TranslateTransform.X)"/> 
            <DoubleAnimation Duration="0:0:0" 
                To="-1" 
                Storyboard.TargetName="translation" 
                Storyboard.TargetProperty="(TranslateTransform.Y)"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.ExitActions> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter TargetName="content" Property="Opacity" Value="0.5" /> 
        </Trigger> 

       </ControlTemplate.Triggers> 

      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Я спасу этот ResourceDictionary, содержащий этот стиль в строку, как это:

XamlWriter.Save(s); 

где s является ResourceDictionary. проблемы в том, что, когда я получаю ожидаемую строку, это выглядит так:

<Style TargetType=\"Button\" x:Key=\"{x:Type Button}\"> 
    <Style.Resources> 
     <ResourceDictionary /> 
    </Style.Resources> 
    <Setter Property=\"UIElement.Focusable\"> 
     <Setter.Value> 
      <s:Boolean>False</s:Boolean> 
     </Setter.Value> 
    </Setter> 
    <Setter Property=\"Panel.Background\"> 
     <Setter.Value> 
      <SolidColorBrush>#FFF1F2F4</SolidColorBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property=\"TextElement.Foreground\"> 
     <Setter.Value> 
      <SolidColorBrush>#FF13776A</SolidColorBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property=\"Control.Template\"> 
     <Setter.Value> 
      <ControlTemplate TargetType=\"Button\"> 
       <Border BorderThickness=\"1,1,1,1\" CornerRadius=\"3,3,3,3\" BorderBrush=\"#FF13776A\" Background=\"#FFF1F2F4\" Name=\"content\"> 
        <Border.RenderTransform> 
         <TranslateTransform X=\"-1\" Y=\"-1\" /> 
        </Border.RenderTransform> 
        <Grid> 
         <Grid.Style> 
          <Style TargetType=\"Grid\"> 
           <Style.Resources> 
            <ResourceDictionary /> 
           </Style.Resources> 
           <Setter Property=\"Panel.Background\"> 
            <Setter.Value> 
             <SolidColorBrush>#00FFFFFF</SolidColorBrush> 
            </Setter.Value> 
           </Setter> 
          </Style> 
         </Grid.Style> 
         <Label Content=\"{TemplateBinding ContentControl.Content}\" Background=\"#00FFFFFF\" Foreground=\"{TemplateBinding TextElement.Foreground}\" HorizontalContentAlignment=\"Center\" VerticalContentAlignment=\"Center\" Padding=\"{TemplateBinding Control.Padding}\" Style=\"{x:Null}\" Grid.Column=\"0\" Grid.Row=\"0\" /> 
        </Grid> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property=\"ButtonBase.IsPressed\"> 
         <Trigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <Storyboard.Children> 
             <DoubleAnimation To=\"0\" Duration=\"00:00:00\" Storyboard.TargetName=\"translation\" Storyboard.TargetProperty=\"(TranslateTransform.X)\" /> 
             <DoubleAnimation To=\"0\" Duration=\"00:00:00\" Storyboard.TargetName=\"translation\" Storyboard.TargetProperty=\"(TranslateTransform.Y)\" /> 
            </Storyboard.Children> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.EnterActions> 
        <Trigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <Storyboard.Children> 
           <DoubleAnimation To=\"-1\" Duration=\"00:00:00\" Storyboard.TargetName=\"translation\" Storyboard.TargetProperty=\"(TranslateTransform.X)\" /> 
           <DoubleAnimation To=\"-1\" Duration=\"00:00:00\" Storyboard.TargetName=\"translation\" Storyboard.TargetProperty=\"(TranslateTransform.Y)\" /> 
          </Storyboard.Children> 
         </Storyboard> 
        </BeginStoryboard> 
        </Trigger.ExitActions> 
         <Trigger.Value> 
          <s:Boolean>True</s:Boolean> 
         </Trigger.Value> 
        </Trigger> 
        <Trigger Property=\"UIElement.IsEnabled\"> 
         <Setter Property=\"UIElement.Opacity\" TargetName=\"content\"> 
          <Setter.Value> 
           <s:Double>0.5</s:Double> 
          </Setter.Value> 
         </Setter> 
         <Trigger.Value> 
          <s:Boolean>False</s:Boolean> 
         </Trigger.Value> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Пожалуйста, обратите внимание на TranslateTransform в Border.RenderTransform. В ResourceDictionary он имеет x: Name = "translation", но имя отсутствует в выходной строке.

Где я ошибался или это ошибка? Заранее спасибо.

ответ

0

В соответствии с this MSDN blog post "некоторые расширения разметки, такие как {х: Static}, не будут разрешены при нагрузке времени с помощью XamlReader и само расширение разметки отбрасывают, так что никаких средств для XamlWriter повторно произвести его «Похоже, что x:Name является одним из тех расширений разметки, которые потеряны.

Похоже, вы пытаетесь создать два стиля - оригинальный и расширенный - которые неявно нацеливают кнопку (предположительно в разных областях). Если это так, вы можете создать базовый стиль в ресурсе, который могут ссылаться на оба вышеописанных стили, а затем использовать свойство стиля BasedOn, чтобы избежать дублирования шаблона.

+0

NextInLine, Да, я уже выяснил, что после чтения некоторые расширения разметки отбрасываются. Я хочу создать расширяемое приложение с System.AddIn и сделать его части похожими на единицу. Итак, я хотел, чтобы мое приложение-хост отправляло текущую тему в аддины. В любом случае, спасибо! – VMaleev