我在我的ViewModel中构建了一个scrollViewer及其元素,它内置于一个属性FrameworkElement PageElement
我每次发生某个事件时重建pageElement
,我想将PageElement
绑定到视图中的真实scrollViewer,这样每当我更改pageElement
时,它就会在它的视图中绘制。
答案 0 :(得分:1)
让我给你一点扶手椅的建议。我不知道你的项目的细节,但你的问题中的细节让我得出一些结论。
首先,让您的视图模型创建UI元素没有错。但这真的很不寻常。听起来你可能会错过数据模板或数据模板选择器的概念。
使用数据模板可以获得丰富的数据表示,这些数据是在转发器或单个内容控件中生成和呈现单个记录时构建的。
使用数据模板选择器可以让您拥有各种不同的数据表示,使用代码隐藏逻辑可以根据数据或其他条件进行切换。
参考模板:http://blog.jerrynixon.com/2012/08/windows-8-beauty-tip-using.html
其次,由于发生事件而重新生成UI会听起来像是性能问题的短路径。
每次手动创建元素并将其添加到可视树时,在重新渲染布局时,都会使应用程序面临绑定滞后的风险。在ARM上运行你的应用程序我打赌你可能已经看到了它。然后,简单的UI可能不会受到这个一般经验法则的影响。
因为我不知道这个事件,我不能认为它经常发生。但是,如果它经常发生,那么即使是简单的用户界面也会受此影响。
现在回答您的问题
Sherif,scrollviewer
上没有可以设置水平或垂直偏移的写入启用属性。设置scrollviewer
的偏移量的唯一方法是调用changeview()
。
var s = new ScrollViewer();
s.ChangeView(0, 100, 0);
你不能绑定到一个方法,所以绑定到这样的东西是非启动的,没有一些代码隐藏来读取所需的偏移并直接调用该方法。
这样的事情:
public sealed partial class MainPage : Page
{
MyViewModel _Vm = new MyViewModel();
ScrollViewer _S = new ScrollViewer();
public MainPage()
{
this.InitializeComponent();
this._Vm.PropertyChanged += (s, e) =>
{
if (e.PropertyName.Equals("Offset"))
_S.ChangeView(0, _Vm.Offset, 0);
};
}
}
public class MyViewModel : INotifyPropertyChanged
{
private int _Offset;
public int Offset
{
get { return _Offset; }
set
{
_Offset = value;
PropertyChanged(this, new PropertyChangedEventArgs("Offset"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
但我要提醒你。偏移量需要基于某些东西。并且这些变量可能会根据窗口大小,字体大小,变换缩放以及许多其他因素而发生变化。上面的代码大部分时间都可以工作,但在其他设备上可能会频繁失败。
那么,该怎么办?我的建议是你在代码隐藏中编写代码,监视你认为需要滚动的任何场景,并简单地以编程方式从bode-behind滚动它。但要注意,以编程方式滚动滚动查看器可能会使您的UI与用户混淆。
你知道你的应用。你必须选择。
祝你好运!