【问题标题】:C# - Component reference - Dispacher.CheckAccess()C# - 组件参考 - Dispacher.CheckAccess()
【发布时间】:2012-05-22 01:48:40
【问题描述】:

我有问题。我需要使用传递一个参数的函数(对控件的引用):

public void recalculateFontSize(ref TextBlock component)
{
...
}

我想用但是不知道如何用“ref”关键字连接Dispatcher:S

    private void textResizer(ref TextBlock component)
    {
        if (component.Dispatcher.CheckAccess())
        {
            textUtils.recalculateFontSize(ref component);
        }
        else
        {
            component.Dispatcher.Invoke(new Action<TextBlock>(textResizer), component);
        }
    }

如何修改component.Dispatcher.Invoke ???

【问题讨论】:

  • 那不应该是ref
  • 您不需要ref。只需将其删除。
  • 因为当我删除它时,该方法可以正常工作,但TextBlock的FontSize不会改变

标签: c# wpf reference dispatcher ref


【解决方案1】:

我会说,传递 UI 控件总是几乎是个坏主意。

为什么不稍微调整一下逻辑,以便您可以在视图中使用绑定(我认为您使用的是 WPF,因为涉及到 Dispatcher)

这样您的 ViewModel 将公开 RecalculateFontSize 命令,然后您的 View 绑定到一个 Font Size 属性,ViewModel 可以根据每个请求更改该属性。

这样,在您的命令中,您可以通过 Dispatcher.CheckAccess 检查访问并在 UI 线程中调用 FontSize 的重新计算。

【讨论】:

    【解决方案2】:

    您不能在匿名方法体中使用 ref 或 out 参数。

    【讨论】:

      【解决方案3】:

      好的,谢谢。但是还有另一个想法可以做到这一点。 可以简单地使用这样的东西:

      <Viewbox>
         <TextBlock Text="Bla bla bla" TextWrapping="Wrap" />
      </Viewbox>
      

      效果很好。

      另一种方法是创建 ObjectDataProvider 资源并将我们的 TextBlock 绑定到它。 这里有更多信息:http://msdn.microsoft.com/en-us/library/aa348824.aspx

      【讨论】:

        猜你喜欢
        • 2016-02-14
        • 2018-01-05
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多