我有UserControl
我这样显示,它是用于在打印前预览收据票:
<ScrollViewer x:Name="xzScroll" Template="{StaticResource scrollView}" Height="488" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">
<Border x:Name="xzPreview" BorderThickness="0" Background="White" Margin="0,0,10,0" Padding="15">
// The UserControl
</Border>
</ScrollViewer>
当用户想要打印收据时,我会从其父UserControl
中移除Border
,并根据可打印区域尝试重新测量并重新排列控件:
public void Print()
{
PrintDialog dlg = new PrintDialog();
this.Measure(new Size(dlg.PrintableAreaWidth, double.PositiveInfinity));
this.Arrange(new Rect(this.DesiredSize));
this.UpdateLayout();
dlg.PrintTicket.PageMediaSize = new PageMediaSize(this.ActualWidth, this.ActualHeight);
....
}
但是,Height
和Width
属性不会更改,导致打印错误,边缘混乱,边上有一些文字剪裁。
当我在代码中创建UserControl
的新实例,然后使用Measure
和Arrange
方法时,我会看到Width
和Height
属性根据PrinteableAreaWidth
而变化,从而产生正确的收据票。
如何确保Width
和Height
属性设置正确?
答案 0 :(得分:0)
您是否想要调整Usercontrol的大小?
如果是,为什么不为具有两个属性高度和宽度的Usercontrol创建一个类(ViewModel),并将用户控件绑定到这些属性。 您可以在不删除Usercontrol的情况下更改大小。
这里举例说明ViewModel的外观如何。您需要实现INotifyPropertyChanged。
public class UserControlViewModel:INotifyPropertyChanged
{
private double _height;
private double _width;
public double _height
{
get { return _height;}
set {
if(_height == value)
return;
_height = value;
OnPropertyChanged();
}
public double _width
{
get { return _width;}
set {
if(_width == value)
return;
_width = value;
OnPropertyChanged();
}
在Xaml中你可以用这种方式绑定它。
<ScrollViewer x:Name="xzScroll" Template="{StaticResource scrollView}" Height="488" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">
<Border x:Name="xzPreview" BorderThickness="0" Background="White" Margin="0,0,10,0" Padding="15">
<MyUserControl
DataContext = "{Binding MyControlViewModelObject}"
Height = "{Binding Height}"
Width = "{Binding Width}"/>
</Border>
</ScrollViewer>
答案 1 :(得分:0)
您可能已在UserControl
中声明了具有完全Margin
和/或Height
和Width
维度的UI元素...当然,我可以&确保这一点,因为您没有向我们展示您的相关代码。
但是,如果是这种情况,那么您无法通过外部重新调整UserControl
来重新排列它们。解决方案是使用Grid
控件来组织UI元素,以便在调整UserControl
大小时自动调整它们的大小。有关详细信息,请参阅MSDN上的Grid
Class页面。