为什么我的命名WPF形状在代码后台中无法访问?

3

我在我的WPF应用程序中有一个Ellipse,我想在它被双击时改变其轮廓的颜色。 我找到了这篇(旧)关于如何使用可用的MouseDown事件并在事件处理程序中检查ClickCount为2来使其工作的教程。 这是我问题的最简单解决方案,我想尝试让它先工作,而不是创建一个空的按钮控件模板
然而,我无法在我的后台代码文件中找到被单击的椭圆形。 教程中说这个方法可以工作,但我想知道是否漏掉了什么。
这里是包含椭圆形的代码。 它是网格的第三列:

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Grid.Column="3">
     <StackPanel Orientation="Vertical" Margin="3,1" Background="GhostWhite">
        <ItemsControl Name="FlowLinkItems" ItemsSource="{Binding FlowLinkList}">
           <ItemsControl.ItemTemplate>
              <DataTemplate>
                 <Grid Height="40">
                    <Ellipse Name="FlowLinkEllipse" Stroke="BlueViolet" Height="38" VerticalAlignment="Center" MouseDown="Ellipse_MouseDown"/>
                    <TextBlock TextAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Message}"></TextBlock>
                 </Grid>
              </DataTemplate>
           </ItemsControl.ItemTemplate>
        </ItemsControl>
     </StackPanel>
  </ScrollViewer>

在本教程中,behind方法的代码如下所示:
private void Ellipse_MouseDown(object sender, MouseButtonEventArgs e)
  {
     if (e.ClickCount == 2)
     {
        FlowLinkEllipse.Stroke = "Red";
     }
  }

我看到的错误信息是:

'FlowLinkEllipse' 的名称在当前上下文中不存在

如果这种方法不可行,我愿意接受尽可能简单的建议(我还不熟悉WPF,我的应用程序将处理的唯一内容就是双击)。
注意:我已经在代码后面加了这一行,并且它可以正常工作。
FlowLinkItems.MouseLeftButtonUp += FlowLinkItems_MouseLeftButtonUp;


也许尝试使用x:Name="FlowLinkEllipse"? - Mike Schwartz
5
代码后台无法访问模板成员名称。 - Magus
请使用 DataTemplate.Triggers - Federico Berasategui
@HighCore 像这个答案中的实现方式一样吗?https://dev59.com/8W025IYBdhLWcg3wAxF9 如果我需要在ItemsControl中通过单击访问我的椭圆和文本块,这是正确的方法吗? - valsidalv
@valsidalv 是的,一个绑定了ItemsSourceItemsControl是一种可视化的数据表示形式,这些数据实际上是存储在其他地方的。数据负责保持自己的状态,UI不负责保持数据的状态,因此ItemTemplate内部任何UI元素的所有属性都应该绑定到数据项中相关的属性,而不是通过过程性代码进行操作。 - Federico Berasategui
1个回答

2

正如@Magus所指出的,你无法从代码后台引用一个在中的项。然而,在这里应该没有问题:sender将包含对椭圆的引用:

private void Ellipse_MouseDown(object sender, MouseButtonEventArgs e)
{
   if (ellipse as sender == null || e.ClickCount < 2)
      return;

   var ellipse = (Ellipse)sender;
   ellipse.Stroke = System.Windows.Media.Brushes.Red;
}

1
当然...我曾经尝试过(Ellipse)sender,但它没有起作用。对于未来的读者,设置描边颜色的正确方法是ellipse.Stroke = new BrushConverter().ConvertFromString("Red") as SolidColorBrush; - valsidalv
3
你不需要使用 BrushConverter 相关的东西。只需使用 System.Windows.Media.Brushes.Red 代替基于字符串的神奇写法即可。 - Federico Berasategui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接