Как заставить TreeViewItems не наследовать свойство Tooltip от их родителя - PullRequest
3 голосов
/ 28 июля 2011

У меня есть приложение, в котором есть квази IDE, где TreeView выступает в качестве обозревателя решений.Пользователь является дизайнером экрана, который может выглядеть следующим образом.

Root
    Menus
        MainMenu
            MenuItem1
    Button Bars
        MainBar
            Button1

У меня изначально были проблемы с контекстными меню.В приведенном выше примере MenuItem1 не имеет контекстного меню, но MainMenu делает.Ну, MenuItem1 будет наследовать контекстное меню от MainMenu.Я получил это, создав пустое контекстное меню и присвоив его MenuItem1.Хотелось бы что-нибудь более элегантное.

У меня такие же проблемы с подсказками.Если я назначу один MainMenu, то MenuItem1 наследует тот, который назначен MainMenu.Я попытался установить подсказку MenuItem1 на ноль, ничего не сделал.Если я установлю его на «», пустая строка переопределяет всплывающую подсказку MainMenu, но когда вы наводите курсор мыши на MenuItem1, появляется небольшое пустое поле с подсказкой.Я думал, что система была бы достаточно умной, чтобы не показывать окно, если бы это была пустая строка, но, очевидно, нет.

Как я могу запретить детям наследовать свойства контекстного меню и всплывающей подсказки от своих родителей?

Обновлено


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

Единственное, что я могу придумать, это то, что для каждой всплывающей подсказки обрабатываетсяToolTipOpening и проверьте строку, если она не имеет длины, затем немедленно закройте ее.Хотя должен быть лучший способ.

Ответы [ 5 ]

4 голосов
/ 14 мая 2012

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

System.Windows.Controls.ToolTip tt = new System.Windows.Controls.ToolTip();
tt.Content = tooltipDescription;
if (tooltipDescription == null)
    tt.Visibility = Visibility.Collapsed;
item.ToolTip = tt;
1 голос
/ 28 июля 2011

Вы пытались установить ToolTipService.IsEnabled="False", это отключит всплывающую подсказку для нужного элемента.

0 голосов
/ 27 апреля 2016

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

Как и в некоторых других ответах, я использую стиль с сеттером для свойства Tooltip. Ключевые отличия:

  1. Связывание Visibility элемента ToolTip вместо элемента TextBlock, показывающего подсказку.
  2. Обертывание TextBlock элементом Border. Это позволило избежать случайного появления крошечного пустого блока наконечника.
<local:StringToVisibilityConverter x:Key="strToVisibilityConverter"/>

<Style x:Key="MyTreeStyleKey" TargetType="TreeViewItem">
  <Setter Property="ToolTip">
    <Setter.Value>
      <ToolTip Visibility="{Binding TipText, Converter={StaticResource strToVisibilityConverter}}">
        <Border>
          <TextBlock Text="{Binding TipText}"/>
        </Border>
      </ToolTip>
    </Setter.Value>
  </Setter>
</Style>

StringToVisibilityConverter - простой созданный мной конвертер, который возвращает Visibility.Collapsed для нулевых или пустых строк, Visibility.Visible в противном случае.

0 голосов
/ 29 мая 2013

Для себя я создал стиль с нулями Ширина и Высота :

<Style x:Key="NullToolTip" TargetType="{x:Type ToolTip}">
    <Setter Property="Width" Value="0" />
    <Setter Property="Height" Value="0" />
    <Setter Property="Content" Value="{x:Null}" />
</Style>

Когда я создал Подсказка с этим стилем и поместил в ресурсы:

<ToolTip x:Key="NoToolTip" Style="{StaticResource NullToolTip}" />

Затем установите эту подсказку для каждого элемента:

<TreeViewItem Header="Sample" ToolTipService.ToolTip="{StaticResource NoToolTip}">

или в стиле:

<Setter Property="ToolTipService.ToolTip" Value="{StaticResource NoToolTip}" />

В этом случае null ToolTip для элемента будет использоваться по умолчанию, но когда вы установите ToolTip , он будет определен только для него.

0 голосов
/ 30 июля 2011

Во-первых, маскирование всплывающей подсказки должно выполняться с помощью null, а не string.empty.Во-вторых, если бы вы использовали иерархический шаблон данных и привязку источника элементов для своего древовидного представления, вы могли бы установить всплывающие подсказки на основе иерархии вашего шаблона (например, привязки к свойству в иерархии объектов из модели или источника элементов), и в этом случае они должны были оказать влияние.на основе вашего конкретного элемента дерева.

На данный момент вы можете использовать ноль для маскировки.

...