diff options
author | Lluis Sanchez Gual <lluis@xamarin.com> | 2014-02-19 22:16:23 +0400 |
---|---|---|
committer | Lluis Sanchez Gual <lluis@xamarin.com> | 2014-02-19 22:16:23 +0400 |
commit | 2fb9b0ad97837a640379e39494b2a12437cd45a5 (patch) | |
tree | 83aee064ded7956896fb98a7225ef0bd2bf5b33d /Xwt.WPF | |
parent | 659fd666489b32587c5845aec1574cb3146f6f7a (diff) | |
parent | ea3ca3beffac204cfe7509af5a5498996a274f96 (diff) |
Merge branch 'new-scroll-properties'
Diffstat (limited to 'Xwt.WPF')
-rw-r--r-- | Xwt.WPF/Xwt.WPF.csproj | 1 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs | 20 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs | 24 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs | 56 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ScrollControlBackend.cs | 106 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs | 20 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs | 20 |
7 files changed, 232 insertions, 15 deletions
diff --git a/Xwt.WPF/Xwt.WPF.csproj b/Xwt.WPF/Xwt.WPF.csproj index a6005d52..3d9fdddc 100644 --- a/Xwt.WPF/Xwt.WPF.csproj +++ b/Xwt.WPF/Xwt.WPF.csproj @@ -145,6 +145,7 @@ <Compile Include="Xwt.WPFBackend\WindowsSpinButton.xaml.cs" />
<Compile Include="Xwt.WPFBackend\WpfKeyboardHandler.cs" />
<Compile Include="Xwt.WPFBackend\WebViewBackend.cs" />
+ <Compile Include="Xwt.WPFBackend\ScrollControlBackend.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
diff --git a/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs index f5dc6cbc..39135966 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs @@ -42,6 +42,16 @@ namespace Xwt.WPFBackend ListBox.DisplayMemberPath = ".[0]"; } + public ScrollViewer ScrollViewer { + get { + Decorator border = System.Windows.Media.VisualTreeHelper.GetChild(ListBox, 0) as Decorator; + if (border != null) + return border.Child as ScrollViewer; + else + return null; + } + } + public ScrollPolicy VerticalScrollPolicy { get { return ScrollViewer.GetVerticalScrollBarVisibility (ListBox).ToXwtScrollPolicy(); } @@ -54,6 +64,16 @@ namespace Xwt.WPFBackend set { ScrollViewer.SetVerticalScrollBarVisibility (ListBox, value.ToWpfScrollBarVisibility ()); } } + public IScrollControlBackend CreateVerticalScrollControl() + { + return new ScrollControlBackend(ScrollViewer, true); + } + + public IScrollControlBackend CreateHorizontalScrollControl() + { + return new ScrollControlBackend(ScrollViewer, false); + } + public void SetViews (CellViewCollection views) { ListBox.DisplayMemberPath = null; diff --git a/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs index 9a271d0a..9a4b3973 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs @@ -43,7 +43,17 @@ namespace Xwt.WPFBackend { ListView = new ExListView(); ListView.View = this.view; - } + } + + public ScrollViewer ScrollViewer { + get { + Decorator border = System.Windows.Media.VisualTreeHelper.GetChild(ListView, 0) as Decorator; + if (border != null) + return border.Child as ScrollViewer; + else + return null; + } + } public ScrollPolicy VerticalScrollPolicy { get { return ScrollViewer.GetVerticalScrollBarVisibility (this.ListView).ToXwtScrollPolicy (); } @@ -55,7 +65,17 @@ namespace Xwt.WPFBackend set { ScrollViewer.SetHorizontalScrollBarVisibility (ListView, value.ToWpfScrollBarVisibility ()); } } - private bool borderVisible = true; + public IScrollControlBackend CreateVerticalScrollControl() + { + return new ScrollControlBackend(ScrollViewer, true); + } + + public IScrollControlBackend CreateHorizontalScrollControl() + { + return new ScrollControlBackend(ScrollViewer, false); + } + + private bool borderVisible = true; public bool BorderVisible { get { return this.borderVisible; } diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs index 034aa936..12a7ae5a 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs @@ -31,7 +31,7 @@ using System.Windows.Controls; namespace Xwt.WPFBackend { internal class ScrollAdjustmentBackend - : Backend, IScrollAdjustmentBackend + : Backend, IScrollAdjustmentBackend, IScrollControlBackend { double scrollValue; double lowerValue; @@ -39,28 +39,68 @@ namespace Xwt.WPFBackend double pageIncrement; double stepIncrement; double pageSize; + bool isVertical; + IScrollAdjustmentEventSink eventSink; + IScrollControlEventSink controlEventSink; public CustomScrollViewPort TargetViewport { get; set; } - public void Initialize (IScrollAdjustmentEventSink eventSink) + public ScrollViewer TargetScrollViewer { get; set; } + + public ScrollAdjustmentBackend() + { + } + + public ScrollAdjustmentBackend (ScrollViewer s, bool isVertical) + { + TargetScrollViewer = s; + this.isVertical = isVertical; + scrollValue = 0; + lowerValue = 0; + } + + public void Initialize(IScrollAdjustmentEventSink eventSink) { - EventSink = eventSink; + eventSink = eventSink; + } + + public void Initialize (IScrollControlEventSink eventSink) + { + controlEventSink = eventSink; } public void SetOffset (double offset) { // The offset is relative to 0, it has to be converted to the lower/upper value range scrollValue = LowerValue + offset; - Context.InvokeUserCode (EventSink.OnValueChanged); + Context.InvokeUserCode (delegate { + if (eventSink != null) + eventSink.OnValueChanged (); + if (controlEventSink != null) + controlEventSink.OnValueChanged (); + }); } public double Value { get { return scrollValue; } set { + scrollValue = value; + // Provide the value to the viewport, which will update // the ScrollView. The viewport expects an offset starting at 0. - TargetViewport.SetOffset (this, value - LowerValue); + if (TargetViewport != null) + TargetViewport.SetOffset(this, value - LowerValue); + + if (upperValue == lowerValue) + return; + + var off = (value - lowerValue) / (upperValue - lowerValue); + + if (isVertical) + TargetScrollViewer.ScrollToVerticalOffset(TargetScrollViewer.ExtentHeight * off); + else + TargetScrollViewer.ScrollToVerticalOffset(TargetScrollViewer.ExtentWidth * off); } } @@ -114,11 +154,5 @@ namespace Xwt.WPFBackend if (TargetViewport != null) TargetViewport.UpdateCustomExtent (); } - - internal IScrollAdjustmentEventSink EventSink - { - get; - private set; - } } }
\ No newline at end of file diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollControlBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ScrollControlBackend.cs new file mode 100644 index 00000000..3c0808ba --- /dev/null +++ b/Xwt.WPF/Xwt.WPFBackend/ScrollControlBackend.cs @@ -0,0 +1,106 @@ +// +// ScrollControlBackend.cs +// +// Author: +// lluis <> +// +// Copyright (c) 2014 lluis +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using Xwt.Backends; +using System.Windows.Controls; + +namespace Xwt.WPFBackend +{ + public class ScrollControlBackend: Backend, IScrollControlBackend + { + double scrollValue; + bool isVertical; + ScrollViewer targetScrollViewer; + + public ScrollControlBackend() + { + } + + public ScrollControlBackend (ScrollViewer s, bool isVertical) + { + targetScrollViewer = s; + this.isVertical = isVertical; + scrollValue = Value; + targetScrollViewer.ScrollChanged += HandleScrollChanged; + } + + void HandleScrollChanged (object sender, ScrollChangedEventArgs e) + { + if (Value != scrollValue) { + scrollValue = Value; + Context.InvokeUserCode (EventSink.OnValueChanged); + } + } + + public void Initialize(IScrollControlEventSink eventSink) + { + EventSink = eventSink; + } + + public double Value + { + get { return isVertical ? targetScrollViewer.VerticalOffset : targetScrollViewer.HorizontalOffset; } + set { + if (isVertical) + targetScrollViewer.ScrollToVerticalOffset(value); + else + targetScrollViewer.ScrollToVerticalOffset(value); + } + } + + public double LowerValue + { + get { return 0; } + } + + public double UpperValue + { + get { return isVertical ? targetScrollViewer.ScrollableHeight : targetScrollViewer.ScrollableWidth; } + } + + public double PageIncrement + { + get { return PageSize; } + } + + public double StepIncrement + { + get { return 1; } + } + + public double PageSize + { + get { return isVertical ? targetScrollViewer.ViewportWidth : targetScrollViewer.ViewportHeight; } + } + + internal IScrollControlEventSink EventSink + { + get; + private set; + } + } +} + diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs index 0a762768..da33c6df 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs @@ -51,6 +51,22 @@ namespace Xwt.WPFBackend set { ScrollViewer.HorizontalScrollBarVisibility = GetScrollVisibility (value); } } + IScrollControlBackend vscrollControl; + public IScrollControlBackend CreateVerticalScrollControl() + { + if (vscrollControl == null) + vscrollControl = new ScrollControlBackend(ScrollViewer, true); + return vscrollControl; + } + + IScrollControlBackend hscrollControl; + public IScrollControlBackend CreateHorizontalScrollControl() + { + if (hscrollControl == null) + hscrollControl = new ScrollControlBackend(ScrollViewer, false); + return hscrollControl; + } + protected override double DefaultNaturalHeight { get @@ -103,8 +119,8 @@ namespace Xwt.WPFBackend var widget = (WidgetBackend)child; if (widget.EventSink.SupportsCustomScrolling ()) { - vbackend = new ScrollAdjustmentBackend (); - hbackend = new ScrollAdjustmentBackend (); + vscrollControl = vbackend = new ScrollAdjustmentBackend (); + hscrollControl = hbackend = new ScrollAdjustmentBackend (); } ScrollViewer.Content = new CustomScrollViewPort (widget.NativeWidget, vbackend, hbackend); ScrollViewer.CanContentScroll = true; diff --git a/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs index 0d49c535..b8a56c08 100644 --- a/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs @@ -59,6 +59,16 @@ namespace Xwt.WPFBackend Tree.SetValue (VirtualizingStackPanel.IsVirtualizingProperty, true); } + public ScrollViewer ScrollViewer { + get { + Decorator border = System.Windows.Media.VisualTreeHelper.GetChild(Tree, 0) as Decorator; + if (border != null) + return border.Child as ScrollViewer; + else + return null; + } + } + public TreePosition CurrentEventRow { get; set; } public ScrollPolicy VerticalScrollPolicy { @@ -71,6 +81,16 @@ namespace Xwt.WPFBackend set { ScrollViewer.SetHorizontalScrollBarVisibility (Tree, value.ToWpfScrollBarVisibility ()); } } + public IScrollControlBackend CreateVerticalScrollControl() + { + return new ScrollControlBackend(ScrollViewer, true); + } + + public IScrollControlBackend CreateHorizontalScrollControl() + { + return new ScrollControlBackend(ScrollViewer, false); + } + public TreePosition[] SelectedRows { get { return Tree.SelectedItems.Cast<TreePosition> ().ToArray (); } } |