【问题标题】:Different values in different instances of the same usercontrol in WPFWPF中同一用户控件的不同实例中的不同值
【发布时间】:2017-11-17 09:31:11
【问题描述】:

我正在为一个应用程序创建一个地图,我需要以两种不同的方式呈现它。一张小地图和一张普通地图,都由一张UserControl组成。我的问题是我试图找到一种平滑的方式来显示带有区域名称的常规大小的地图,而没有显示迷你地图。我一直在研究 DependencyProperties 作为这样做的一种可能方式,或者至少是一种说明我的思路的方式。我目前所拥有的就是这个。

    public bool MiniMap
    {
        get { return (bool)GetValue(MiniMapProperty); }
        set { SetValue(MiniMapProperty, value); }
    }

    public static DependencyProperty MiniMapProperty =
        DependencyProperty.Register("MiniMap", 
        typeof(bool), 
        typeof(myMap), 
        new PropertyMetadata());

然后,我在 UserControl 中拥有所有带有正确标签的 TextBlock,如果 MiniMap 属性设置为 true,则当前尝试删除 Text 属性,如果设置为 false,则让它们保留。目前我只是在地图的标题上做这件事,但是一旦我开始工作,我就可以遍历它们。

    if (MiniMap == true)
        {
            this.Title.Text = "";
        }

然后我在另一个视图中实例化这个 UserControl 两次,MiniMap 属性在一种情况下设置为 true,在另一种情况下设置为 false。

    <map:myMap x:Name="myMap" Visibility="Collapsed" MiniMap="False"/>
    <map:myMap x:Name="miniMap" Visibility="Visible" MiniMap="True"/>

这里的想法是,一旦您单击地图按钮,就会出现大地图(将 Visibility 更改为 Visible)并且由于在此实例中 MiniMap 属性设置为 false,因此 TextBlock(s) 应该是空的,或者最好删除 - 但这是一个不同的问题。我的问题是,无论我做什么,我的UserControl 的两个实例似乎总是对MiniMap 属性具有相同的值,所以我只能在两种情况下都打开TextBlock,或者在两种情况下都关闭。任何人都知道我怎样才能让它工作,或者有其他更适合我的问题的解决方案吗?

【问题讨论】:

  • 你是在声明这个用户控件的 2 个实例,还是在实例中处理两个地图的单个用户控件?
  • 查看我对最后一个代码 sn-p 的编辑。我将相同的 UserControl 实例化了两次,但其中一个被缩小了一点(迷你地图)。我只需要他们弄清楚它们是迷你地图还是普通版。
  • 我不知道这是否是您的问题格式,但是您的两个用户控件具有相同的名称。如果您按名称引用它们,这似乎是一个问题。
  • 我猜这不是你真正的代码,因为你给你的两个控件赋予了相同的名字。
  • 那只是我懒惰地复制粘贴上面的行对不起。它们在我的应用程序中有不同的名称。对不起。我已经从代码中删除了一些部分(缩放、边距和大小调整等)以保持代码整洁。

标签: c# wpf xaml user-controls dependency-properties


【解决方案1】:

尝试使用 propertychanged 回调

public static DependencyProperty MiniMapProperty =
    DependencyProperty.Register("MiniMap", 
    typeof(bool), 
    typeof(myMap), 
    new PropertyMetadata(new PropertyChangedCallback(OnMiniMapPropertyChanged)));


private static void OnMiniMapPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var control = sender as myMap;
            if (control != null && (bool)e.NewValue == true)
                control.Title.Text = "";
        }

【讨论】:

  • 现在我收到一个错误“当前上下文中不存在名称 'True'”。似乎它无法将其识别为布尔值。
  • 抱歉打错了。在事件中放置一个制动点,并在创建控件后检查它是否再次被调用。如果是,那么您可能在某处更改了 MiniMap 值而您忘记了它
  • 好吧,我会被诅咒的,那成功了!不过,我不太确定如何,如果您有时间,我很想快速解释一下为什么这会奏效。无论如何,非常感谢!
  • @Tom 您没有为您的依赖属性提供一个 dafult 值,因此系统采用 MiniMap 属性的默认值,该值对于 bool 是 false (这就是为什么您的实例都看到 false 的原因) .由于您没有为更改的属性注册事件,我想当您在 xaml 中设置它时,应用程序只是忽略您对属性的更改
  • 啊哈。我按照其他一些教学视频告诉我,我必须删除默认值才能设置它。仍在尝试掌握 PropertyChanged 方法的变体,所以学习起来很好。感谢您解决我的问题并解释我做错了什么。祝您周末愉快! :)
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 2021-08-10
  • 2013-08-19
  • 1970-01-01
相关资源
最近更新 更多