У меня есть ToolBar
который я разрабатываю, используя код, показанный ниже. Я столкнулся с тремя проблемами с моим стилем ToolBar
:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.caliburnproject.org">
<Style x:Key="ToolBarToggleButton" TargetType="{x:Type ToggleButton}"
BasedOn="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}">
<Setter Property="Icon" Value="{Binding Icon}"/>
<Setter Property="ToolTip" Value="{Binding FullToolTip}" />
<Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
<Setter Property="IsChecked" Value="{Binding IsChecked}" />
<Setter Property="cal:Action.Target" Value="{Binding}" />
<Setter Property="cal:Message.Attach" Value="{Binding ActionText}" />
</Style>
...
Изображения панели инструментов в настоящее время используются как один статический экземпляр. Даже при наличии свойства x:Shared="False"
перемещение ToolBar
один над другим приведет к отказу рендеринга.
Решение:
В ToolTip Styles.xaml включите источник изображения в качестве ContentTemplate
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.caliburnproject.org">
<Style x:Key="ToolBarToggleButton" TargetType="{x:Type ToggleButton}"
BasedOn="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image x:Shared="false" Source="{Binding Icon}">
<Image.Style>
<Style TargetType="Image">
<Setter Property="Width" Value="16" />
<Setter Property="Height" Value="16" />
<Setter Property="Stretch" Value="Fill" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.5" />
</Trigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ToolTip" Value="{Binding FullToolTip}" />
<Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
<Setter Property="IsChecked" Value="{Binding IsChecked}" />
<Setter Property="cal:Action.Target" Value="{Binding}" />
<Setter Property="cal:Message.Attach" Value="{Binding ActionText}" />
</Style>
<Style x:Key="ToolBarButton" TargetType="{x:Type Button}"
BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image x:Shared="false" Source="{Binding Icon}">
<Image.Style>
<Style TargetType="Image">
<Setter Property="Width" Value="16" />
<Setter Property="Height" Value="16" />
<Setter Property="Stretch" Value="Fill" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.5" />
</Trigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ToolTip" Value="{Binding FullToolTip}" />
<Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
<Setter Property="cal:Action.Target" Value="{Binding}" />
<Setter Property="cal:Message.Attach" Value="{Binding ActionText}" />
</Style>
</ResourceDictionary>
Теперь у нас есть:
Никаких других изменений не требуется.
Такая же процедура перетаскивания привязки ToolTip
и ToolTipService
также повреждается - на данном этапе я не уверен в основной причине. Быстрое решение - сделать то, что я сделал с изображением выше, и добавить ToolTip
к Image
. Однако это приводит к тому, что ToolTip
показывает только, когда над Image
а не при падении по самому краю кнопки.
Частичное решение:
Добавьте ToolTip
в Image
. Однако это не идеально, так как подсказки инструмента не отображаются, когда на самом краю кнопки.
Когда выполняется операция перетаскивания, показанная выше, это также нарушает привязки свойств Caliburn
<Setter Property="cal:Action.Target" Value="{Binding}" />
<Setter Property="cal:Message.Attach" Value="{Binding ActionText}" />
Вопросы: (вторая и третья проблемы)
ToolTip
рендеринга?Спасибо за ваше время.
"Я, наконец, исправил это. Насколько я могу судить, когда вы начинаете перетаскивание на панели инструментов, любые элементы панели инструментов на других панелях инструментов, которые покрываются панелью, которую вы перетаскиваете, удаляются из их текущего положения в визуальном дереве, а затем (предположительно) добавляется обратно, когда они снова становятся видимыми.
Когда они удаляются из визуального дерева (опять же, что я думаю, что происходит), они также теряют доступ к стилям ToolBarToggleButton и ToolBarButton, потому что они определены в словаре ресурсов Styles.xaml, который добавлен в ToolBarsView.xaml.
Однако, если вы определяете те же самые стили глобально, то это работает - предположительно, хотя они больше не являются дочерними элементами ToolBarsView, они все еще имеют доступ к глобальным ресурсам.
Итак... Я добавил новое свойство, IModule.GlobalResourceDictionaries, которое позволяет каждому модулю объявлять любые словари ресурсов, которые должны быть добавлены в глобальную область. Модуль ToolBars использует это ".
https://github.com/tgjones/gemini/issues/67#issuecomment-60040008
Попробуйте повторно назначить подсказки как триггер стиля для мыши над событием, например:
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="ToolTip" Value="{Binding FullToolTip}" />
<Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="ToolTip" Value="{Binding FullToolTip}" />
<Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>