gpt4 book ai didi

c# - 在 Canvas 上选择已绑定(bind)的路径

转载 作者:行者123 更新时间:2023-12-03 10:55:08 24 4
gpt4 key购买 nike

我对 WPF 还是有点陌生​​,所以如果我遗漏了一两个明显的概念,我深表歉意。

我正在使用遵循 MVVM 范例的 WPF。我真正的问题有点复杂,所以我会尽量简化。假设我在 Canvas 上有一些(实际上是很多)路径:

<Canvas x:Name="Canvas1" Width="600" Height="300">
<Path x:Name="Path1" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path2" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path3" Style="{StaticResource PathStyle}" .../>
/>

我正在使用的那种风格包含一些使所有路径保持相同颜色的绑定(bind),如下所示:
<Style x:Key="PathStyle" TargetType="Path">
<Setter Property="Fill" Value="{Binding FillColor, Converter={StaticResource BrushConverter}}"/>
<Setter Property="Stroke" Value="{Binding StrokeColor, Converter={StaticResource BrushConverter}}"/>
</Style>

当用户单击其中一条路径时,我可以捕获。当他们这样做时,我想“覆盖”绑定(bind)并更改所述路径的颜色,直到用户单击另一个。我可以手动设置 Path.Stroke当他们点击它时,但我不知道如何在清除 SelectedPath 后“重新激活”绑定(bind)(因此路径保持我设置的任何颜色)。我尝试获取绑定(bind)表达式以强制它刷新,但返回结果为 null ( selectedPath.GetBindingExpression(Path.StrokeProperty) )。

TL;DR:我想这样当用户单击路径时,它会变成蓝色。当单击另一条路径时,我希望它根据样式中的绑定(bind)返回到它应该是的任何颜色。

有什么想法吗?感谢您抽出宝贵的时间!

编辑:感谢您的可靠建议-如果我可以再推一点,如果有嵌套 Canvas 怎么办,但我仍然只想选择一条路径?如:
<Canvas x:Name="Canvas_Main" Width="600" Height="300">
<Canvas x:Name="Canvas1" Width="600" Height="300">
<Path x:Name="Path1" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path2" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path3" Style="{StaticResource PathStyle}" .../>
/>
<Canvas x:Name="Canvas1" Width="600" Height="300">
<Path x:Name="Path1" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path2" Style="{StaticResource PathStyle}" .../>
<Path x:Name="Path3" Style="{StaticResource PathStyle}" .../>
/>
/>

最佳答案

以下内容:

  • 使用 ListBox ,它提供了项目选择。
  • 将您的路径移至 ListBox或绑定(bind)ListBox.ItemsSource .
  • 设置 ListBox.ItemsPanel Canvas .
  • 在路径样式中引入 DataTrigger触发 {Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}
  • 添加 Setter到根据需要更改所选路径颜色的触发器。
  • (添加 ListBox.ItemContainerStyle 以覆盖 ListBoxItem.Template 如果默认情况下看起来很奇怪。)


  • 编辑:很好奇它是否按预期工作,所以这是一个独立的例子:
    <ListBox Height="300" Width="300">
    <ListBox.Resources>
    <Style TargetType="Path">
    <Setter Property="Stroke" Value="Black"/>
    <Setter Property="Fill" Value="Red"/>
    <Style.Triggers>
    <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
    Value="True">
    <Setter Property="Fill" Value="Blue"/>
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </ListBox.Resources>
    <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
    <Canvas/>
    </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
    <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="ListBoxItem">
    <ContentPresenter />
    </ControlTemplate>
    </Setter.Value>
    </Setter>
    </Style>
    </ListBox.ItemContainerStyle>
    <Path>
    <Path.Data>
    <RectangleGeometry Rect="50,50,25,25" />
    </Path.Data>
    </Path>
    <Path>
    <Path.Data>
    <RectangleGeometry Rect="0,0,25,25" />
    </Path.Data>
    </Path>
    </ListBox>

    关于c# - 在 Canvas 上选择已绑定(bind)的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25872538/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com