工具提示内容更改应用于所有元素
tool tip content change getting applied to all elements
我正在创建一个应用程序,我在其中动态创建网格拆分器并在代码中应用样式。该样式还为这些网格拆分器设置了工具提示。我正在使用工具提示来显示控件的宽度并在调整大小时动态更新它们。当我使用 DragDelta 事件更改一个工具提示的内容时,它会应用于所有 gridsplitter 的工具提示(所有开始显示相同的宽度)。下面是代码:
风格XAML:
<Style x:Key="VGS" TargetType="GridSplitter">
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Width" Value="5"/>
<Setter Property="VerticalAlignment" Value="Stretch"/>
<Setter Property="Grid.RowSpan" Value="1"/>
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Opacity="0"/>
</Setter.Value>
</Setter>
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip MinWidth="75" BorderBrush="Black" HasDropShadow="False"
Placement="Top" PlacementRectangle="-70,-5,50,50"
HorizontalContentAlignment="Left" >
</ToolTip>
</Setter.Value>
</Setter>
<EventSetter Event="DragDelta" Handler="Drag_VerticalGridSplitter"/>
<EventSetter Event="PreviewMouseLeftButtonUp" Handler="Update_TableColumnDimensions"/>
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="Show_ToolTip"/>
</Style>
创建 GridSplitter 的方法:
private GridSplitter Get_VerticalGridSplitter(int column)
{
GridSplitter gs = new GridSplitter();
Grid.SetRow(gs, 0);
Grid.SetColumn(gs, column);
gs.ToolTip = "Width: 150";
gs.Style = MainGrid.FindResource("VGS") as Style;
return gs;
}
更新工具提示的方法:
void Drag_VerticalGridSplitter(object sender, DragDeltaEventArgs e)
{
//Sets grid width as the grid is resized
double newGridWidth = 0;
foreach (ColumnDefinition columnDefinition in MainGrid.ColumnDefinitions)
newGridWidth = newGridWidth + columnDefinition.Width.Value;
MainGrid.Width = newGridWidth;
//update border
MainGridBorder.Width = MainGrid.Width + 2;
GridSplitter gs = sender as GridSplitter;
ToolTip tt = gs.ToolTip as ToolTip;
tt.Content = "Width: " + MainGrid.ColumnDefinitions[Grid.GetColumn(gs)].Width;
tt.PlacementTarget = gs;
tt.IsOpen = true;
}
我感觉我在更新内容的时候就是在改变风格。谁能指出这里出了什么问题。
谢谢
我怀疑问题与 xaml 资源的工作方式有关。由于您在样式 setter 内创建一个 ToolTip
实例,您可能只会创建一个 ToolTip
并将其分配给使用该样式的每个 GridSplitter
。您可以尝试将 x:Shared="false"
添加到您的样式中,使其在每次应用时都创建该样式的新实例,或者您可以尝试针对 ToolTip
类型定义一个单独的样式并直接使用它。
我正在创建一个应用程序,我在其中动态创建网格拆分器并在代码中应用样式。该样式还为这些网格拆分器设置了工具提示。我正在使用工具提示来显示控件的宽度并在调整大小时动态更新它们。当我使用 DragDelta 事件更改一个工具提示的内容时,它会应用于所有 gridsplitter 的工具提示(所有开始显示相同的宽度)。下面是代码:
风格XAML:
<Style x:Key="VGS" TargetType="GridSplitter">
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Width" Value="5"/>
<Setter Property="VerticalAlignment" Value="Stretch"/>
<Setter Property="Grid.RowSpan" Value="1"/>
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Opacity="0"/>
</Setter.Value>
</Setter>
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip MinWidth="75" BorderBrush="Black" HasDropShadow="False"
Placement="Top" PlacementRectangle="-70,-5,50,50"
HorizontalContentAlignment="Left" >
</ToolTip>
</Setter.Value>
</Setter>
<EventSetter Event="DragDelta" Handler="Drag_VerticalGridSplitter"/>
<EventSetter Event="PreviewMouseLeftButtonUp" Handler="Update_TableColumnDimensions"/>
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="Show_ToolTip"/>
</Style>
创建 GridSplitter 的方法:
private GridSplitter Get_VerticalGridSplitter(int column)
{
GridSplitter gs = new GridSplitter();
Grid.SetRow(gs, 0);
Grid.SetColumn(gs, column);
gs.ToolTip = "Width: 150";
gs.Style = MainGrid.FindResource("VGS") as Style;
return gs;
}
更新工具提示的方法:
void Drag_VerticalGridSplitter(object sender, DragDeltaEventArgs e)
{
//Sets grid width as the grid is resized
double newGridWidth = 0;
foreach (ColumnDefinition columnDefinition in MainGrid.ColumnDefinitions)
newGridWidth = newGridWidth + columnDefinition.Width.Value;
MainGrid.Width = newGridWidth;
//update border
MainGridBorder.Width = MainGrid.Width + 2;
GridSplitter gs = sender as GridSplitter;
ToolTip tt = gs.ToolTip as ToolTip;
tt.Content = "Width: " + MainGrid.ColumnDefinitions[Grid.GetColumn(gs)].Width;
tt.PlacementTarget = gs;
tt.IsOpen = true;
}
我感觉我在更新内容的时候就是在改变风格。谁能指出这里出了什么问题。 谢谢
我怀疑问题与 xaml 资源的工作方式有关。由于您在样式 setter 内创建一个 ToolTip
实例,您可能只会创建一个 ToolTip
并将其分配给使用该样式的每个 GridSplitter
。您可以尝试将 x:Shared="false"
添加到您的样式中,使其在每次应用时都创建该样式的新实例,或者您可以尝试针对 ToolTip
类型定义一个单独的样式并直接使用它。