首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF -为带有RelativeSource绑定的自定义标记扩展提供设计-时间值

WPF -为带有RelativeSource绑定的自定义标记扩展提供设计-时间值
EN

Stack Overflow用户
提问于 2014-03-09 23:16:44
回答 1查看 1.5K关注 0票数 2

N.B.:这不仅仅是关于自定义标记扩展。请在标记为副本之前阅读.

我有一个带有转换器的WPF标记扩展,这两个扩展如下:

代码语言:javascript
复制
  [ValueConversion(typeof(WindowState), typeof(object))]
  internal class WindowStateToObjectConverter : IValueConverter {
    public WindowStateToObjectConverter() { }

    public WindowStateToObjectConverter(object maximized, object normal) {
      this.maximized = maximized;
      this.normal = normal;
    }

    #region Properties
    #region Maximized Property
    private object maximized;

    public object Maximized {
      get { return maximized; }
      set { maximized = value; }
    }
    #endregion
    #region Normal Property
    private object normal;

    public object Normal {
      get { return normal; }
      set { normal = value; }
    }
    #endregion
    #endregion

    public object Convert(object value, Type targetType, object param, CultureInfo culture) {
      if((value as WindowState? ?? WindowState.Normal) == WindowState.Maximized) return maximized;
      else return normal;
    }

    public object ConvertBack(object value, Type targetType, object param, CultureInfo culture) {
      throw new InvalidOperationException("Cannot convert downwards to WindowState");
    }
  }

  [MarkupExtensionReturnType(typeof(Binding))]
  internal class WindowMaximizedSwitchExtension : MarkupExtension {
    object maximized, normal;

    public WindowMaximizedSwitchExtension(object maximized, object normal) {
      this.maximized = maximized;
      this.normal = normal;
    }

    public override object ProvideValue(IServiceProvider serviceProvider) {
      Binding ret = new Binding("WindowState");
      RelativeSource retRSource = new RelativeSource(RelativeSourceMode.FindAncestor);
      retRSource.AncestorType = typeof(Window);
      ret.RelativeSource = retRSource;
      ret.Converter = new WindowStateToObjectConverter(maximized, normal);
      return ret.ProvideValue(serviceProvider);
    }
  }

它们用于我正在设计的自定义窗口--它们将用于切换某些值(边框宽度、边距等)。当窗口最大化的时候。然而,在设计时,它们总是返回null,这是一个真正的痛苦,因为然后我的窗口如下所示:

...when,它应该是这样的:

(忽略第一个图片中缺少标题和图标,尽管如果您有解决方案,可以随意回答--本质上是相同的问题。)

由于明显的原因,用它来设计是非常困难的。在窗口预览中看到的唯一主要问题是我使用扩展设置Row/ColumnDefinitions的位置-当它返回null时,Height/Width被设置为1*。因此,我的问题是,在设计时是否有一种方法来选择默认值,而不是绑定(例如,非最大化值)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-09 23:37:26

我觉得自己像个白痴,但我很快就找到了解决办法:

在表达式的ProvideValue方法中,我添加了以下行:

代码语言:javascript
复制
  ret.FallbackValue = normal;

当窗口没有最大化时,normal是要使用的值。

ProvideValue现在看起来如下所示:

代码语言:javascript
复制
public override object ProvideValue(IServiceProvider serviceProvider) {
  Binding ret = new Binding("WindowState");
  RelativeSource retRSource = new RelativeSource(RelativeSourceMode.FindAncestor);
  retRSource.AncestorType = typeof(Window);
  ret.RelativeSource = retRSource;
  ret.Converter = new WindowStateToObjectConverter(maximized, normal);
  ret.FallbackValue = normal;
  return ret.ProvideValue(serviceProvider);
}

这将在设计时返回正常值。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22289545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档