Привязка подсказки WPF

Я - только две недели в WPF, таким образом, это - вероятно, тривиальный вопрос. У меня есть набор "CellList", который имеет несколько свойств, которые я хотел бы связать с a ToolTip таким образом, когда я нависаю над информацией о маркировке от текущего экземпляра CellList отображен. Как я делаю это? Я понимаю простую привязку и это, возможно, простая привязка также, но я не могу перенести голову вокруг этого. Ниже мой XAML для маркировки. Мог кто-то объяснять мне, как я могу выполнить это.

<HierarchicalDataTemplate>
      <ListBox ItemsSource="{Binding CellList}">
           <ListBox.ItemTemplate>
               <DataTemplate>
                 <Label Content=" " Height="20" Width="15" Background="{Binding Path=ExptNameBkg, Converter={StaticResource ExptNameToBrushConverter}}"                                                   BorderBrush="Black" BorderThickness="1" >
                  </Label>  
              </DataTemplate>                                    
            </ListBox.ItemTemplate>   
       </ListBox>
</HierarchicalDataTemplate>

Спасибо.

8
задан Dave Clemmer 18 September 2011 в 18:16
поделиться

3 ответа

Необходимо подключиться к сигналу drag-motion и изменить поведение по умолчанию, чтобы оно никогда не указывало до/после сброса:

def _drag_motion(self, widget, context, x, y, etime):
    drag_info = widget.get_dest_row_at_pos(x, y)
    if not drag_info:
        return False
    path, pos = drag_info
    if pos == gtk.TREE_VIEW_DROP_BEFORE:
        widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE)
    elif pos == gtk.TREE_VIEW_DROP_AFTER:
        widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_AFTER)
    context.drag_status(context.suggested_action, etime)
    return True
-121--4460204-

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

    >> a=['matlab','is','fun']

a =

matlabisfun

>> size(a)

ans =

     1    11

В символьном массиве каждый символ в строке считается одним элементом, что объясняет, почему размер 1X11.

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

>> a={'matlab','is','fun'}

a = 

    'matlab'    'is'    'fun'

>> size(a)

ans =

     1     3
-121--2774024-
<Label Content={Binding Path=Id} ToolTip={Binding Path=Name}/>

просто попробуйте это

18
ответ дан 5 December 2019 в 04:41
поделиться

Вот kaxaml - уже пример, который включает всплывающую подсказку, которая немного сложнее, чем просто текст:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <XmlDataProvider x:Key="CharacterData">
      <x:XData>
        <Data xmlns="">
          <Character First="Bart" Last="Simpson" Background="LightGreen" />
          <Character First="Homer" Last="Simpson" Background="LightBlue" />
          <Character First="Lisa" Last="Simpson" Background="Pink" />
          <Character First="Maggie" Last="Simpson" Background="Yellow" />
          <Character First="Marge" Last="Simpson" Background="PapayaWhip" />
        </Data>
      </x:XData>
    </XmlDataProvider>
    <ToolTip x:Key="ElaborateToolTip">
      <Grid Margin="5">
        <Rectangle RadiusX="6" RadiusY="6" Fill="{Binding XPath=@Background}" />
        <StackPanel Orientation="Horizontal" Margin="10">
          <TextBlock Text="{Binding XPath=@First}" Margin="0,0,6,0" />
          <TextBlock Text="{Binding XPath=@Last}" />
        </StackPanel>
      </Grid>
    </ToolTip>
  </Page.Resources>
  <ListBox ItemsSource="{Binding Source={StaticResource CharacterData}, XPath=Data/Character}">
    <ListBox.ItemContainerStyle>
      <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="ToolTip" Value="{StaticResource ElaborateToolTip}" />
      </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
      <DataTemplate>
        <TextBlock Text="{Binding XPath=@First}" />
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</Page>
4
ответ дан 5 December 2019 в 04:41
поделиться

Сложность ToolTip заключается в том, что ToolTip - это объект, который вы связываете с элементом управления, а не часть его визуального дерева. Таким образом, вы не можете заполнить его так, как вы заполняли бы элементы в визуальном дереве, например:

<TextBox.ToolTip>
   <StackPanel>
      ...put bound controls here
   </StackPanel>
</TextBox.ToolTip>

Вместо этого вам нужно создать конкретный экземпляр всплывающей подсказки и назначить ему стиль, который устанавливает его DataContext (очень важно; именно так вы можете привязаться к свойствам источника данных его «целевого объекта размещения», то есть элемента управления, отображающего всплывающую подсказку) и его шаблона . Затем поместите в шаблон визуальное дерево ToolTip , включая привязки. Наконец, обратитесь к ToolTip в вашем элементе управления.

Итак, вот TextBox , Binding которого выполняет проверку:

<TextBox ToolTip="{StaticResource ErrorToolTip}">
    <TextBox.Text>
        <Binding Source="SourceProperty">
            <Binding.ValidationRules>
               <DataErrorValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

Он использует эту ToolTip :

<ToolTip x:Key="ErrorToolTip" Style="{StaticResource ErrorToolTipStyle}"/>

И ToolTip ] использует этот стиль, который получает свое содержимое из свойства ValidationError источника привязки TextBox :

<Style x:Key="ErrorToolTipStyle" TargetType="{x:Type ToolTip}">
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="HasDropShadow" Value="True"/>
    <Setter Property="DataContext" Value="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToolTip">
                <Border
                    Name="Border" 
                    BorderThickness="1" 
                    BorderBrush="LightGray">
                    <StackPanel Orientation="Vertical">
                        <Label Background="Firebrick" Foreground="White" FontWeight="Bold" Margin="4">Validation error</Label>
                        <TextBlock Margin="10" Text="{Binding ValidationError}"/>
                    </StackPanel>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasDropShadow" Value="true">
                        <Setter TargetName="Border" Property="CornerRadius" Value="4"/>
                        <Setter TargetName="Border" Property="SnapsToDevicePixels" Value="true"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Я не уверен в этом, но думаю, что единственный часть вышеперечисленного, которая фактически должна быть установлена ​​в стиле, - это DataTrigger , устанавливающий DataContext ; Я думаю, что почти все остальное можно просто явно установить в визуальном дереве ToolTip . Но я, наверное, не думаю о чем-то важном.

22
ответ дан 5 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: