Ошибка привязки при перетаскивании панели инструментов

1

У меня есть 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 один над другим приведет к отказу рендеринга.

Изображение 174551

Решение:

В 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>

Теперь у нас есть:

Изображение 174551

Никаких других изменений не требуется.

Во-вторых:

Такая же процедура перетаскивания привязки ToolTip и ToolTipService также повреждается - на данном этапе я не уверен в основной причине. Быстрое решение - сделать то, что я сделал с изображением выше, и добавить ToolTip к Image. Однако это приводит к тому, что ToolTip показывает только, когда над Image а не при падении по самому краю кнопки.

Частичное решение:

Добавьте ToolTip в Image. Однако это не идеально, так как подсказки инструмента не отображаются, когда на самом краю кнопки.

В третьих:

Когда выполняется операция перетаскивания, показанная выше, это также нарушает привязки свойств Caliburn

<Setter Property="cal:Action.Target" Value="{Binding}" />
<Setter Property="cal:Message.Attach" Value="{Binding ActionText}" />

Вопросы: (вторая и третья проблемы)

  1. Как устранить проблему с помощью ToolTip рендеринга?
  2. Как устранить проблему с привязкой к свойствам Caliburn?

Спасибо за ваше время.


Решение:

"Я, наконец, исправил это. Насколько я могу судить, когда вы начинаете перетаскивание на панели инструментов, любые элементы панели инструментов на других панелях инструментов, которые покрываются панелью, которую вы перетаскиваете, удаляются из их текущего положения в визуальном дереве, а затем (предположительно) добавляется обратно, когда они снова становятся видимыми.

Когда они удаляются из визуального дерева (опять же, что я думаю, что происходит), они также теряют доступ к стилям ToolBarToggleButton и ToolBarButton, потому что они определены в словаре ресурсов Styles.xaml, который добавлен в ToolBarsView.xaml.

Однако, если вы определяете те же самые стили глобально, то это работает - предположительно, хотя они больше не являются дочерними элементами ToolBarsView, они все еще имеют доступ к глобальным ресурсам.

Итак... Я добавил новое свойство, IModule.GlobalResourceDictionaries, которое позволяет каждому модулю объявлять любые словари ресурсов, которые должны быть добавлены в глобальную область. Модуль ToolBars использует это ".

https://github.com/tgjones/gemini/issues/67#issuecomment-60040008

  • 0
    Похоже, что к этим панелям инструментов применяются некоторые пользовательские стили / шаблоны - цветовая схема не похожа на системную тему. Вы пытались удалить пользовательские стили, чтобы увидеть, помогает ли это?
  • 0
    Привет, Майк, большое спасибо за твой ответ. Я подтвердлю это позже вечером. Я в настоящее время далеко от своего стола. Еще раз спасибо.
Показать ещё 2 комментария
Теги:
wpf
binding
mvvm
caliburn.micro

1 ответ

1
Лучший ответ

Попробуйте повторно назначить подсказки как триггер стиля для мыши над событием, например:

    <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>
  • 0
    Это выглядит многообещающе! Я попробую это сейчас ... Есть мысли по поводу привязок Caliburn?
  • 0
    Это сработало достаточно хорошо. Если вы можете предоставить решение по третьему вопросу, щедрость принадлежит вам, сэр. Всего наилучшего.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню