【问题标题】:Binding Frame.BackgroundProperty with ImageBrush in code behind在后面的代码中将 Frame.BackgroundProperty 与 ImageBrush 绑定
【发布时间】:2015-10-02 13:47:11
【问题描述】:

我想通过绑定设置rootFrame的背景,但我遇到了一些问题。

我有这个代码,但它不起作用...

Binding myBinding = new Binding();
myBinding.Source = DataModel.Settings;
myBinding.Path = new PropertyPath("SelectedBackgroundIndex");
myBinding.Mode = BindingMode.TwoWay;
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
myBinding.Converter = new BgIndexToBgConverter();
rootFrame.SetBinding(Frame.BackgroundProperty, myBinding);

我认为我做错了,我应该先创建ImageBrush,然后绑定它的源。 此代码有效,但如何通过绑定实现它?

rootFrame.Background = new ImageBrush
{
     Stretch = Windows.UI.Xaml.Media.Stretch.UniformToFill,
     ImageSource = new BitmapImage { UriSource = new Uri("ms-appx:///Assets/Backgrounds/" +  
     DataModel.Settings.SelectedBackgroundIndex.ToString() + ".png") }
};

我尝试使用BitmapImage 创建new ImageBrush() 并将Uri 的源绑定到它,但是我有很多乱七八糟的代码无论如何都不起作用,所以我不会在这里复制它。

编辑:
转换器返回对应背景图片的路径。

int index = (int)value;
string path = "ms-appx:///Assets/Backgrounds/" + index.ToString() + ".png";
return path;

SelectedBackgroundIndex 是带有通知的整数属性

private int selectedBackgroundIndex;
public int SelectedBackgroundIndex
{
     get
     {
          return selectedBackgroundIndex;
     }
     set
     {
          selectedBackgroundIndex = value;
          NotifyPropertyChanged("SelectedBackgroundIndex");
     }
}

【问题讨论】:

  • 看起来你正在绑定一个索引,所以转换器肯定有一些有趣的事情发生。发布转换器代码和DataModel.Settings 的所有相关部分。否则我真的无法判断出了什么问题。什么是“不起作用”?没有刷子,不切换还是什么?
  • 我更新了问题。不起作用意味着根本没有背景(它是黑色的)。
  • 你的错误是背景需要画笔而不是我相信的路径。

标签: c# wpf


【解决方案1】:

您是否让转换器返回画笔而不是路径:

int index = (int)value;
ImageBrush retValue = new ImageBrush
{
    Stretch = Windows.UI.Xaml.Media.Stretch.UniformToFill,
    ImageSource = new BitmapImage { UriSource = new Uri("ms-appx:///Assets/Backgrounds/" + index.ToString() + ".png") }
};
return retValue;

当然要做得更好,并进行错误检查等,但这会让想法更容易理解。

此外,我不会将其设为双向绑定。实际上没有办法将画笔转换回索引。

【讨论】:

  • 它完成了这项工作,但看起来它不能像这样绑定,因为当我更改 SelectedBackgroundIndex 的值时背景不会改变(rootFrame 没有得到通知?)。我会尝试以某种方式解决这个问题。感谢您的帮助!
  • 在你的转换器中设置一个断点,如果在你设置索引后它没有被命中,你没有收到通知,然后从那里开始(检查输出窗口以查找错误等等在)。如果它确实被击中,那么转换器中有错误并进行调试。
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多