显示一组矩形(图形上的点)的自定义工具提示

本文关键字:自定义 工具提示 图形 一组 显示 | 更新日期: 2023-09-27 18:33:05

我有一个Canvas,我在上面画了许多Rectangles,这些代表了画布上许多用户选择的位置。

我想为每个矩形创建一个ToolTip,显示矩形的 x 和 y 坐标以及到另一个点的距离:"手写笔点"。

当然,x 和 y 坐标在创建矩形时是已知的,但到触笔点的距离不是,因此工具提示每次显示时都需要更新其文本。

我尝试使用如下所示的绑定,但这只会将文本"System.Windows.Control.ToolTip"放在工具提示中。

    ...
    Rectangle rectangle = new Rectangle
    {
        Width = _rectWidth,
        Height = _rectWidth,
        Fill = new SolidColorBrush(Colors.Red)
    };
    rectangle.ToolTip = new ToolTip();
    Binding binding = new Binding()
    {
        Source = this,
        Path = new PropertyPath("ToolTipBinding"),
        Mode = BindingMode.OneWay,
        UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
    };
    BindingOperations.SetBinding( rectangle.ToolTip as ToolTip ,ToolTipService.ToolTipProperty, binding);
}
public string ToolTipBinding 
{
    get
    {
        return "How would i get the data context here (even if it bound correctly)";
    }
}

任何帮助非常感谢。

显示一组矩形(图形上的点)的自定义工具提示

这就是我想出的解决方案。 这将在画布上将点列表显示为正方形。下面的TargetList是包含每个点所需数据的Target对象列表。希望这对某人有所帮助。

为工具提示创建的资源:

<UserControl.Resources>
    <Style TargetType="{x:Type ToolTip}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToolTip}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition />
                            <RowDefinition />
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <TextBox Grid.Row="0" Grid.Column="0" Text="X:" />
                        <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=PositionX}" />
                        <TextBox Grid.Row="1" Grid.Column="0" Text="Z:" />
                        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Path=PositionZ}" />
                        <TextBox Grid.Row="2" Grid.Column="0" Text="ΔX:" />
                        <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Path=DeltaX}" />
                        <TextBox Grid.Row="3" Grid.Column="0" Text="ΔZ:" />
                        <TextBox Grid.Row="3" Grid.Column="1" Text="{Binding Path=DeltaZ}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
<UserControl.Resources>

项目控件

<ItemsControl Grid.Row="0" Grid.Column="0" ClipToBounds="True" ItemsSource="{Binding TargetList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left" Value="{Binding Path=PositionScreen.X}" />
            <Setter Property="Canvas.Top" Value="{Binding Path=PositionScreen.Z}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle Width="{Binding RectangleSize}" 
                       Height="{Binding RectangleSize}" 
                       Fill="{Binding RectangleBrush}" >
                <Rectangle.ToolTip>
                    <ToolTip />
                </Rectangle.ToolTip>
            </Rectangle>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

目标类,仅显示属性名称。这些内容会根据需要进行更新。

public class Target : ObservableObject
{
    public Point3D PositionX...
    public Point3D PositionZ...
    public double DeltaX...
    public double DeltaZ...
    public Point3D PositionScreen...
    public double RectangleSize...
    public Brush RectangleBrush...
}