从容器中删除后重新呈现用户控件

时间:2015-02-06 07:18:05

标签: c# wpf user-controls render measure

我有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);

    ....
}

但是,HeightWidth属性不会更改,导致打印错误,边缘混乱,边上有一些文字剪裁。

当我在代码中创建UserControl的新实例,然后使用MeasureArrange方法时,我会看到WidthHeight属性根据PrinteableAreaWidth而变化,从而产生正确的收据票。

如何确保WidthHeight属性设置正确?

2 个答案:

答案 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和/或HeightWidth维度的UI元素...当然,我可以&确保这一点,因为您没有向我们展示您的相关代码。

但是,如果是这种情况,那么您无法通过外部重新调整UserControl来重新排列它们。解决方案是使用Grid控件来组织UI元素,以便在调整UserControl大小时自动调整它们的大小。有关详细信息,请参阅MSDN上的Grid Class页面。