2015-12-29 4 views
0

У меня есть gridview с шаблоном данных, который включает togglebutton. Элемент данных для элементов в Gridview имеет в себе сетку со стилизованной кнопкой togglebutton. Стиль для togglebutton находится в Grid.Resources. Он отлично работает, но когда я перемещаю стиль из Grid.Resources на страницу .Resources или App.xaml, содержимое внутри кнопки, которое определено в стиле, исчезает из всех, кроме первого появления кнопки в gridview. Вот стиль:Стиль работает только для первого появления, когда снаружи Grid.Resources?

<Style TargetType="ToggleButton" x:Key="teststyle"> 
     <Setter Property="Padding" Value="0"/> 
     <Setter Property="Content"> 
      <Setter.Value> 
       <Path HorizontalAlignment="Center" Stroke="Black" StrokeThickness="1.25" VerticalAlignment="Center" Height="9" Width="9" Stretch="Uniform" Fill="Black" Data="M 0,0 -11.78,-11.779 0,-23.561 l 1.061,1.061 -9.97,9.971 21.064,0 0,1.5 -21.064,0 9.97,9.968 L 0,0 Z" RenderTransformOrigin="0.5,0.5" > 
        <Path.RenderTransform> 
         <CompositeTransform Rotation="-90"/> 
        </Path.RenderTransform> 
       </Path> 
      </Setter.Value> 
     </Setter> 
</Style> 

Вот скриншоты поведения: http://imgur.com/a/8iZaD Верхнее изображение является оригинальным один, когда стиль был расположен в Grid.Resources, а нижняя, когда стиль получает переехал.

+0

Вы явно устанавливаете стиль ToggleButton для этого ключа StaticResource (в вашей таблице данных)? –

+0

@igrali Вот как выглядит мое объявление ToggleButton в datatemplate: '' – justanotherxl

ответ

1

Вы можете обойти эту проблему с помощью ContentTemplate в вашем стиле, а не содержания.

<Page.Resources> 
    <Style TargetType="ToggleButton"> 
     <Setter Property="Padding" Value="0"/> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <Path HorizontalAlignment="Center" Stroke="Black" StrokeThickness="1.25" VerticalAlignment="Center" Height="9" Width="9" Stretch="Uniform" Fill="Black" Data="M 0,0 -11.78,-11.779 0,-23.561 l 1.061,1.061 -9.97,9.971 21.064,0 0,1.5 -21.064,0 9.97,9.968 L 0,0 Z" RenderTransformOrigin="0.5,0.5" > 
         <Path.RenderTransform> 
          <CompositeTransform Rotation="-90"/> 
         </Path.RenderTransform> 
        </Path> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Page.Resources> 
+0

Это устранило проблему. Вы знаете, почему поведение не соответствует свойству Content? – justanotherxl

+0

Honnestly no :) Я пытаюсь расследовать первопричину, но пока не нашел ответа. –

0

Лучший способ перемещения ваших стилей в XAML - использование Blend-дизайнера.

Вы можете просматривать и упорядочивать свои стили из раздела «Ресурсы» в Blend. После этого вы можете перетащить свой локальный стиль в App.xaml или Resources.xaml. Все ссылки будут обновляться автоматически, вы можете проверить снизу gif-изображение.

enter image description here

+0

Пробовал это. Еще одна проблема :( – justanotherxl

1

Style может работать за пределами DataTemplate, проблема здесь является Path вы установили в качестве Content вашего ToggleButton.

XAML ресурсы в Style должны быть разделяемыми (См XAML resources must be shareable):

для объекта существовать в ResourceDictionary, что объект должен быть разделяемыми.

Подлежит совместному использованию, поскольку, когда дерево объектов приложения создано и используется во время выполнения, объекты не могут существовать в нескольких местах в дереве. Внутри система ресурсов создает копии значений ресурсов для использования в графе объектов вашего приложения, когда запрашивается каждый ресурс XAML.

Но UIElement никогда не могут быть разделяемыми и Path унаследован от UIElement так Path не разделяемые. При настройке Style в DataTemplate и размещении Style за пределами DataTemplate, каждый ToggleButton в пунктах действительно применим Style, но Path может отображаться только один раз, так как он не доступен. Чтобы проверить это, вы можете добавить объект в ваш Style как:

<Style x:Key="teststyle" TargetType="ToggleButton"> 
    <Setter Property="Padding" Value="0" /> 
    <Setter Property="Content"> 
     <Setter.Value> 
      <Path Width="9" 
        Height="9" 
        HorizontalAlignment="Center" 
        VerticalAlignment="Center" 
        Data="M 0,0 -11.78,-11.779 0,-23.561 l 1.061,1.061 -9.97,9.971 21.064,0 0,1.5 -21.064,0 9.97,9.968 L 0,0 Z" 
        Fill="Black" 
        RenderTransformOrigin="0.5,0.5" 
        Stretch="Uniform" 
        Stroke="Black" 
        StrokeThickness="1.25"> 
       <Path.RenderTransform> 
        <CompositeTransform Rotation="-90" /> 
       </Path.RenderTransform> 
      </Path> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Background" Value="Red" /> 
</Style> 

Тогда вы найдете все фоны вашего ToggleButton становятся красными. Также вы можете сразу положить два ToggleButton в StackPanel как:

<StackPanel> 
    <ToggleButton Style="{StaticResource teststyle}" /> 
    <ToggleButton Style="{StaticResource teststyle}" /> 
</StackPanel> 

Вы также можете найти только первый ToggleButton есть путь.

И когда вы положите Style внутри DataTemplate, каждый предмет будет иметь свой собственный Resources, поэтому он отлично работает.

Если вы используете ContentTemplate как @ Жан-Себастьен Дюпюи сказал, то Value стать DataTemplate, который разделяемый, как это происходит от FrameworkTemplate, поэтому он прекрасно работает.