我正在构建一个WPF包装器来使用Acrobat显示PDF(来自this CodePlex项目)
Codeplex项目在PDF Viewer上执行基本功能时提供了足够的样本,但缺乏WPF MVVM模式的功能。我的WPF包装器必须使用Xaml中的Binding来公开依赖项属性以修改Acrobat PDF Viewer的行为。
正常绑定到文件名,PageNumber等属性是正常的,因为我正在执行以下操作:
创建依赖属性(可以从codeplex项目中相对容易地实现)
public static readonly DependencyProperty PdfPathProperty =
DependencyProperty.Register("PdfPath", typeof(string), typeof(PdfViewer), new UIPropertyMetadata(null, LoadPDF));
public string PdfPath {
get {
return (string)GetValue(PdfPathProperty);
}
set {
SetValue(PdfPathProperty, value);
}
}
private static void LoadPDF(DependencyObject d, DependencyPropertyChangedEventArgs e) {
var control = d as PdfViewer;
if (control == null) return;
control.LoadFile();
}
private void LoadFile() {
_winFormPdfHost.LoadFile(PdfPath);
}
使用UserControl的位置,绑定到依赖项属性:
<viewer:PdfViewer x:Name="viewer" PdfPath="{Binding FileName}"
ShowToolbar="{Binding ShowToolbar, UpdateSourceTrigger=PropertyChanged}"
PageNumber="{Binding PageNumber, UpdateSourceTrigger=PropertyChanged}">
</viewer:PdfViewer>
这一切都按预期工作。但是,我需要以某种方式将命令传递给Wrapper。例如,我需要触发一个动作/命令,例如&#39; GoToFirstPage&#39;,这就是我被困住的地方。
我想做以下事情:
<viewer:PdfViewer x:Name="viewer" PdfPath="{Binding FileName}"
ShowToolbar="{Binding ShowToolbar, UpdateSourceTrigger=PropertyChanged}"
PageNumber="{Binding PageNumber, UpdateSourceTrigger=PropertyChanged}"
FirstPageCommand="{Binding GoToFirstPageCommand}">
</viewer:PdfViewer>
然而,这种方法不起作用,因为我不想在ViewModel中实现该命令的功能。我只想在Wrapper中执行该功能。
我基本上想要构建一个自定义工具栏来满足逻辑,而不是使用Acrobat提供的工具栏,我需要能够以某种方式从外部传递或触发包装器中的命令。
修改
我可以通过忽略MVVM来实现这一点,并且只从Wrapper中公开一个公共方法:
在包装器中 - 删除命令的依赖属性,只显示该函数:
public void GoToFirstPage() {
_winFormPdfHost.GoToFirstPage();
}
从ViewModel,通过UserControl访问该方法
private ICommand _FirstPageCommand;
public ICommand FirstPageCommand {
get {
if (_FirstPageCommand == null) {
_FirstPageCommand = CreateCommand(GoToFirstPage);
}
return _FirstPageCommand;
}
}
public void GoToFirstPage(object obj) {
var viewer = obj as WPFPdfViewer.PdfViewer;
viewer.GoToFirstPage();
}
将包装器作为命令参数:
<Button VerticalAlignment="Center" Content="First" Padding="10,5,10,5" Margin="5" Command="{Binding FirstPageCommand}" CommandParameter="{Binding ElementName=viewer}"/>