#xaml #button #uwp #visualstatemanager #contenttemplate
Вопрос:
Я боролся с этим в течение нескольких дней, но теперь не могу найти решение после больших усилий. Это код, в котором я сталкиваюсь с проблемой. ИТАК, у меня есть a ItemsControl
, где каждый элемент есть Button
, и у каждого Button
есть Image
и TextBlock
. Нависнув над Button
ним, я увидел Background
Button
, что он изменился на Red
ожидаемый. Но я не могу изменить значение Foreground
TextBlock
на Green
. Любая помощь в этом отношении высоко ценится
<ControlTemplate x:Key="ButtonTemplate" TargetType="ContentControl">
<Grid Background="Transparent" x:Name="Mini">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="PointerOver">
<VisualState.Setters>
<Setter Target="Mini.Background" Value="Red" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter x:Name="MiniContent" />
</Grid>
</ControlTemplate>
<DataTemplate x:Key="ListItemTemplate" x:DataType="local:DataModel">
<Button
Template="{StaticResource ButtonTemplate}">
<Button.ContentTemplate>
<DataTemplate x:DataType="local:DataModel">
<UserControl>
<Grid >
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="PointerOver">
<VisualState.Setters>
<Setter Target="Value.Foreground" Value="Green" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock x:Name="Value"
Foreground="Yellow"
Text="{x:Bind DisplayName, Mode=OneWay}"/>
<Image
Width="16"
Source="{x:Bind ImageBitmap, Mode=OneWay}"/>
</Grid>
</UserControl>
</DataTemplate>
</Button.ContentTemplate>
</Button>
</DataTemplate>
<ItemsControl
ItemTemplate="{StaticResource ListItemTemplate}"
ItemsSource="{x:Bind DataModelVector, Mode=OneWay}" />
Комментарии:
1. Не могли бы вы, пожалуйста, сказать мне, что вы хотите реализовать? Возможно, есть и другие способы добиться этого вместо использования кнопок.
2. Я хочу показать список из трех приложений одно под другим. Для каждого приложения я хочу показать его изображение и имя приложения. И при наведении приложения я должен иметь возможность изменять фон всего элемента и передний план имени приложения. И при нажатии на приложение я должен иметь возможность запустить его
Ответ №1:
Вам нужно что-то для фактического перехода между визуальными состояниями, состояние перехода указателя не запускается автоматически. Самым простым способом было бы разложить содержимое вашей таблички данных в ее собственный файл (пользовательский элемент управления с разметкой и кодом) и обрабатывать события указателя в коде для перехода между визуальными состояниями с помощью VisualStateManager.ГоТоСтейт.
Вы также можете создать многоразовый «StateTrigger» для перевода любого элемента управления в визуальное состояние «Указатель», но часто какой-то код проще.