父控件的isEnabled属性被设置为true后,超链接仍然不活动

14
我有一个TabItem,其中包含一个ListBox,该ListBox具有我的feeds类的可观察集合作为其项源。当我刷新/加载收集到集合中的feeds时,我想禁用主窗口,以便用户在此过程运行时无法单击其他内容。因此,我将tbCtrl.isEnabled=false;设置为我的表格控件。然后为自定义完成事件分配事件处理程序,该事件在所有feeds加载完成后触发。
这一切都很好,但是当前在选项卡控件上显示的结果的超链接永远不会重新启用(由于列表框大小而不可见的下几个也是如此)。所有其他进一步向下的结果都很好,其他选项卡上的结果也是如此。
我尝试在所有操作完成后在选项卡控件上调用InvalidateVisual,以查看是否有所改变,但那似乎没有引起任何变化。
如果全部是超链接或仅是当前显示的超链接,则我可以理解它,但是我不明白为什么滚动区域之外的超链接也无法正常工作。

Image of Issue


我正在寻找同样问题的答案。我已经将Hyperlink.IsEnabled绑定到具有INotifyPropertyChanged属性的属性。当我单向调用更改时,IsEnabled会更新。另一种方式则不会。(两者都是线程) - 但是具有相同绑定的按钮确实会更改其IsEnabled。我只剩下一个模糊的猜测,即它与流文档的行为不同于控件有关,但不确定为什么?最奇怪的是:如果我将Hyperlink绑定设置为IsEnabled =“{Binding ElementName = AControlWithIsEnabledBinding,Path = IsEnabled}”,它就可以工作!但这算是多大的hack呢? - Daryn
请注意,截至.NET 4.6.1版本,此问题似乎已得到解决。如果您正在4.6.1+环境中进行开发,但针对较低的.NET版本,则需要牢记这一点,因为启用超链接状态看起来对您来说运行正常,但如果某人使用较低的.NET版本运行您的应用程序,则会遇到此问题。 - Mogzol
3个回答

14

我遇到过相同的问题。

我的解决方法是将HyperLink的IsEnabled属性绑定到其父控件上,并将其放在应用程序全局资源中。

<Style TargetType="{x:Type Hyperlink}">
    <Setter Property="IsEnabled" Value="{Binding IsEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type FrameworkElement}}}" />
</Style>

如果你明确地在 HyperLink 上设置了 IsEnabled 并将其绑定到某个会覆盖此全局资源的东西,是吗? - Simon_Weaver
@Simon_Weaver 是的。请参见http://msdn.microsoft.com/en-us/library/ms743230(v=vs.110).aspx。风格是第6个,显式设置是第3个,并具有更高的优先级。 - HelloSam
救命稻草,谢谢!P.S. 你们又怎么知道神话般的世界和微软有什么关系呢? - user6416335

6
我发现了我的超链接不能重新启用的解决方法,不确定它是否适用于您的情况:
我发现当超链接的父控件被禁用(IsEnabled=false)时,即使绑定的属性值发生改变,超链接也不会被通知到更改,例如,IsEnabledChanged不会被触发。
我的解决方案是修改我的Xaml,不再禁用祖先控件(这样会导致超链接的父控件被禁用)。父级(TextBlock)始终启用,现在超链接更新始终正确。
(我有点困扰于IsEnabled绑定的行为与控件的行为不同,如果我不能让祖先控件启用,我不确定该怎么办...但至少这让我理解了我遇到的问题,并让我解决了它。)
详情:WPF 3.5 SP1

0

这不仅仅是超链接HyperLinks的问题。看起来更确切地说是TextBlock的问题,当然,这就是您在WPF中用来包装一个HyperLink的方法。这将导致相同的问题:

<TextBlock>
    <Run Text="Barcode:"/>
    <InlineUIContainer BaselineAlignment="Center">
        <TextBox Text="{Binding OriginalPackage.BarcodeNumber}" />
    </InlineUIContainer>
</TextBlock>

我原本希望设置 IsEnabled="True" 可以解决它,但似乎并没有用。
简单的解决方案是使用一个 Orientation="Horizontal"StackPanel

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