2015-02-06 45 views
0

取出后我有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,并尝试重新测量和重新安排控制根据printeable区域:

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属性将不会瓒ge,从而导致打印错误,边距不齐,文字夹在两边。

当我创建的代码我UserControl一个新实例,然后使用MeasureArrange方法,我看到了WidthHeight性质根据PrinteableAreaWidth变化,导致正确接收票。

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

回答

0

是不是想要调整Usercontrol的大小?

如果是,为什么不用两个属性高度和宽度为Usercontrol创建一个Class(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> 
0

这可能是您已声明与精确Margin和/或HeightWidth尺寸...你UserControl的UI元素,当然,我不能肯定是因为你没有显示我们你的相关代码。

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

+0

我的'UserControl'只包含一些'Grids','ItemControls','TextBlock'等,没有硬编码边距或宽度/高度。这就是奇怪的原因,因为如果我只是在代码中渲染而不把'UserControl'放在'Border'中,那么所有东西都可以很好地展开。有任何想法吗? – DeMama 2015-02-06 09:42:46

+0

你的'ScrollViewer'有一个确切的'Height'集合,这样就可以阻止'UserControl'重新调整大小。 – Sheridan 2015-02-06 10:16:27

+0

我删除了所有可能的“Heights”和“Margins”。但不幸的是仍然没有运气:(猜猜我只是打印代码隐藏实例。 – DeMama 2015-02-06 10:32:50