[wpf] Come specificare una descrizione per un controllo in uno stile da XAML?


Answers

La chiave è usare la proprietà ToolTipService.ToolTip, invece di ToolTip - come questo:

<Setter Property="ToolTipService.ToolTip" Value="My Tooltip"/>
Question

Sto usando un datagrid WPF dal progetto Microsoft CodePlex. Ho un controllo personalizzato che voglio database in un campo dalla riga del datagrid. Non posso per la vita di me capire come specificare un suggerimento su una riga datagrid.

La cosa più vicina che ho imparato è usare un RowStyle con un setter per impostare il suggerimento, ma questo sembra funzionare solo per il testo. Quando provo a inserire ControlTempalte come valore per la descrizione, viene visualizzato il risultato della chiamata a ToString sul tipo ControlTemplate.

Penso di aver bisogno di impostare la proprietà "Template" di ToolTip, ma non riesco a capire come farlo ...

  <dg:DataGrid Name="dgResults" AutoGenerateColumns="True">

            <dg:DataGrid.RowStyle >


            <Style TargetType="{x:Type dg:DataGridRow}">

                <Setter Property="ToolTip"  >
                    <Setter.Value>

                        <ControlTemplate TargetType="{x:Type ToolTip}">
                           <StackPanel>
                                 <TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock>
                           </StackPanel>
                        </ControlTemplate>


                    </Setter.Value>
                </Setter>
            </Style>

        </dg:DataGrid.RowStyle>

  </dg:DataGrid>



Non è necessario il ControlTemplate . Se vuoi StackPanel in ToolTip , basta impostarlo come:

<Setter Property="ToolTip">
    <Setter.Value>
        <StackPanel>
            <TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock>
        </StackPanel>
    </Setter.Value>
</Setter>



Non sono sicuro che tu possa farlo tramite XAML.

Un modo più semplice potrebbe essere gestire semplicemente l'evento LoadingRow. In xaml hanno qualcosa del tipo:

<dg:DataGrid Name="dgResults" AutoGenerateColumns="True" 
             LoadingRow="dgResults_LoadingRow" 
             ItemsSource="{Binding ListOfStrings}" />

Poi nel codice dietro

void dgResults_LoadingRow(object sender, DataGridRowEventArgs e)
{
    DataGridRow row = e.Row;
    row.ToolTip = row.DataContext as string;
}

Ovviamente dovrai cambiare il codice a seconda di come stai popolando i dati nel datagrid. Anche questo non è stato testato =)




Links