2011-02-25 80 views
2

我有一個簡單的測試應用程序,其基本自定義FrameworkElement實現(TestElement如下)。 TestElement創建了一些繪圖視覺效果,並在構造器中繪製了一些寬度爲600的東西。它還實現了IScrollinfo的必要位;包含元素的窗口有一個滾動查看器,最大尺寸爲300x300。滾動條出現但不滾動TestElement的內容。WPF自定義FrameworkElement/IScrollInfo

任何人都可以提出是否我想要做什麼是可能的,如果是的話,我做錯了什麼。我可以在SetHorizo​​ntalOffset中重新渲染繪圖視覺效果,但不想出於性能方面的原因,因爲我已經繪製了我需要的全部視圖。

我希望這個問題有道理 - 如果不是,請告訴我,我可以澄清。

非常感謝卡爾 -

public class TestElement : FrameworkElement, IScrollInfo 
{ 
    DrawingVisual visual; 
    DrawingVisual visual2; 
    public TestElement() 
    { 
     Draw(); 
     this.MaxWidth = 600; 
     this.MaxHeight = 300; 
    } 
    public void Draw() 
    { 
     if(visual == null) 
     { 
      visual = new DrawingVisual(); 
      base.AddVisualChild(visual); 
      base.AddLogicalChild(visual); 
     } 
     if (visual2 == null) 
     { 
      visual2 = new DrawingVisual(); 
      base.AddVisualChild(visual2); 
      base.AddLogicalChild(visual2); 
     } 
     Random rand = new Random(); 
     var pen = new Pen(Brushes.Black, 1); 
     using(var dc = visual.RenderOpen()) 
     { 
      for (int i = 0; i < 400; i++) 
      { 
       var r = rand.Next(10, 200); 
       dc.DrawLine(pen, new Point(i, r), new Point(i, 0)); 
      } 
     } 
     using (var dc = visual2.RenderOpen()) 
     { 
      for (int i = 0; i < 200; i++) 
      { 
       var r = rand.Next(10, 200); 
       dc.DrawLine(pen, new Point(i, r), new Point(i, 0)); 
      } 
      visual2.Offset = new Vector(400, 0); 
     } 
    } 
    protected override int VisualChildrenCount 
    { 
     get { return 2; } 
    } 
    protected override Visual GetVisualChild(int index) 
    { 
     return index == 0 ? visual : visual2; 
    } 
    protected override Size MeasureOverride(Size availableSize) 
    { 
     viewport = availableSize; 
     owner.InvalidateScrollInfo(); 
     return base.MeasureOverride(availableSize); 
    } 
    protected override Size ArrangeOverride(Size finalSize) 
    { 
     var value = base.ArrangeOverride(finalSize); 
     return base.ArrangeOverride(finalSize); 
    } 


    Point offset = new Point(0,0); 
    public void SetHorizontalOffset(double offset) 
    { 
     this.offset.X = offset; 
     this.InvalidateArrange(); 
    } 

    public void SetVerticalOffset(double offset) 
    { 
     this.offset.Y = offset; 
    } 

    public Rect MakeVisible(Visual visual, Rect rectangle) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool CanVerticallyScroll { get; set; } 
    public bool CanHorizontallyScroll { get; set; } 

    Size extent = new Size(600, 300); 

    private Size viewport = new Size(0, 0); 
    public double ExtentWidth 
    { 
     get { return extent.Width; } 
    } 

    public double ExtentHeight 
    { 
     get {return extent.Height; } 
    } 

    public double ViewportWidth 
    { 
     get { return viewport.Width; } 
    } 

    public double ViewportHeight 
    { 
     get { return viewport.Height; } 
    } 

    public double HorizontalOffset 
    { 
     get { return offset.X; } 
    } 

    public double VerticalOffset 
    { 
     get { return offset.Y; } 
    } 

    private ScrollViewer owner; 

    public ScrollViewer ScrollOwner 
    { 
     get { return owner; } 
     set { owner = value; } 
    } 


} 

的XAML:

<Window x:Class="TestWpfApp.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:l ="clr-namespace:TestWpfApp" 
Title="TestWpfApp" Height="300" Width="300" > 
<Grid> 
    <ScrollViewer CanContentScroll="True" HorizontalScrollBarVisibility="Visible"> 
     <l:TestElement CanHorizontallyScroll="True" /> 
    </ScrollViewer> 
</Grid> 

回答

1

剛喝啤酒太多,它可以幫助找到一個解決方案。 ;-)

這不是ultimative「所有做得好」的解決方案,但相信這將進一步幫助您:

在你執行ArrangeOverride,請嘗試:

protected override Size ArrangeOverride(Size finalSize) 
{ 
    this.visual.Offset = new Vector(-this.HorizontalOffset, -this.VerticalOffset); 

    var value = base.ArrangeOverride(finalSize); 
    return base.ArrangeOverride(finalSize); 
} 

基本上,你必須自己移動你的物體。

欲瞭解更多信息也看到這篇文章:iscrollinfo tutorial 。 通常情況下,您將不得不使用轉換將對象移動到滾動它們的地方。

+0

嗨 - 感謝您的回覆。是的,這是行得通的(我確實嘗試了類似的東西,但由於某種原因,我無法讓它起作用),但我同意它不覺得像「做得好」的解決方案。我也必須做一些公平的抵消簿記工作,因爲我需要這樣做,將會有多個圖形視覺,所有視圖都有不同的偏移量。 我會給它一點時間,看看是否有任何添加,然後我會接受這個解決方案。 – kjn 2011-02-25 19:38:36