diff options
author | Vsevolod Kukol <sevoku@microsoft.com> | 2018-11-09 21:29:24 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-09 21:29:24 +0300 |
commit | da9578b8a72ec00c521fb64ee7138d2b0a0dfee1 (patch) | |
tree | d5af63fdd264fd73793fd7a95123a665a77f67b9 /Xwt.WPF | |
parent | 071361009f2067bc87a6a949b71d0200b4ad16fc (diff) | |
parent | b1f37d184f4b8d1b69ca968ccc59450527e39e3c (diff) |
Merge pull request #863 from daserge/scrollview-keyb-focus-style-a11y
[WPF] Indicate ScrollView keyboard focus
Diffstat (limited to 'Xwt.WPF')
-rw-r--r-- | Xwt.WPF/Xwt.WPF.csproj | 6 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/CustomScrollViewPort.cs | 4 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ScrollView.xaml | 41 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs | 50 |
4 files changed, 96 insertions, 5 deletions
diff --git a/Xwt.WPF/Xwt.WPF.csproj b/Xwt.WPF/Xwt.WPF.csproj index 719f015c..3d97251b 100644 --- a/Xwt.WPF/Xwt.WPF.csproj +++ b/Xwt.WPF/Xwt.WPF.csproj @@ -191,4 +191,10 @@ <EmbeddedResource Include="icons\remove-16~disabled.png" />
<EmbeddedResource Include="icons\remove-16~dark~disabled.png" />
</ItemGroup>
+ <ItemGroup>
+ <Resource Include="Xwt.WPFBackend\ScrollView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Resource>
+ </ItemGroup>
</Project>
\ No newline at end of file diff --git a/Xwt.WPF/Xwt.WPFBackend/CustomScrollViewPort.cs b/Xwt.WPF/Xwt.WPFBackend/CustomScrollViewPort.cs index fd388ccd..10c4e771 100644 --- a/Xwt.WPF/Xwt.WPFBackend/CustomScrollViewPort.cs +++ b/Xwt.WPF/Xwt.WPFBackend/CustomScrollViewPort.cs @@ -37,11 +37,13 @@ namespace Xwt.WPFBackend internal class CustomScrollViewPort : SWC.Panel, IScrollInfo { - internal CustomScrollViewPort (object widget, ScrollAdjustmentBackend verticalBackend, ScrollAdjustmentBackend horizontalBackend) + internal CustomScrollViewPort (object widget, SWC.ScrollViewer scrollOwner, ScrollAdjustmentBackend verticalBackend, ScrollAdjustmentBackend horizontalBackend) { if (widget == null) throw new ArgumentNullException ("widget"); + ScrollOwner = scrollOwner; + ((FrameworkElement)widget).RenderTransform = this.transform; if (verticalBackend != null) { diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollView.xaml b/Xwt.WPF/Xwt.WPFBackend/ScrollView.xaml new file mode 100644 index 00000000..6f20769e --- /dev/null +++ b/Xwt.WPF/Xwt.WPFBackend/ScrollView.xaml @@ -0,0 +1,41 @@ +<ResourceDictionary + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:l="clr-namespace:Xwt.WPFBackend;assembly=Xwt.WPF"> + + <Style TargetType="{x:Type l:ExScrollViewer}"> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type l:ExScrollViewer}"> + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition /> + <ColumnDefinition Width="Auto" /> + </Grid.ColumnDefinitions> + <Grid.RowDefinitions> + <RowDefinition /> + <RowDefinition Height="Auto" /> + </Grid.RowDefinitions> + <Border x:Name="PART_ScrollContentPresenter" + BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}"> + <ScrollContentPresenter /> + </Border> + <ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="1" + Value="{TemplateBinding VerticalOffset}" + Maximum="{TemplateBinding ScrollableHeight}" + ViewportSize="{TemplateBinding ViewportHeight}" + Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/> + <ScrollBar x:Name="PART_HorizontalScrollBar" + Orientation="Horizontal" + Grid.Row="1" + Grid.Column="0" + Value="{TemplateBinding HorizontalOffset}" + Maximum="{TemplateBinding ScrollableWidth}" + ViewportSize="{TemplateBinding ViewportWidth}" + Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/> + </Grid> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> +</ResourceDictionary>
\ No newline at end of file diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs index 8affbbf4..59133440 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs @@ -26,17 +26,49 @@ using System; using Xwt.Backends; -using Xwt.WPFBackend; using System.Windows.Controls; +using System.Windows.Media; +using System.Windows; +using System.Windows.Markup; namespace Xwt.WPFBackend { public class ScrollViewBackend : WidgetBackend, IScrollViewBackend { - public ScrollViewBackend() + private static readonly ResourceDictionary ScrollViewResourceDictionary; + static ScrollViewBackend () { - ScrollViewer = new ExScrollViewer(); + Uri uri = new Uri ("pack://application:,,,/Xwt.WPF;component/XWT.WPFBackend/ScrollView.xaml"); + ScrollViewResourceDictionary = (ResourceDictionary) XamlReader.Load (System.Windows.Application.GetResourceStream (uri).Stream); + } + + public ScrollViewBackend () + { + ScrollViewer = new ExScrollViewer (); + ScrollViewer.Resources.MergedDictionaries.Add (ScrollViewResourceDictionary); + ScrollViewer.GotKeyboardFocus += ScrollViewer_GotKeyboardFocus; + ScrollViewer.LostKeyboardFocus += ScrollViewer_LostKeyboardFocus; + } + + Brush previousBrush; + Thickness previousBrushThickness; + void ScrollViewer_LostKeyboardFocus (object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e) + { + if (BorderVisible) { + ScrollViewer.BorderThickness = previousBrushThickness; + ScrollViewer.BorderBrush = previousBrush; + } + } + + void ScrollViewer_GotKeyboardFocus (object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e) + { + if (BorderVisible) { + previousBrush = ScrollViewer.BorderBrush; + previousBrushThickness = ScrollViewer.BorderThickness; + ScrollViewer.BorderThickness = new Thickness (1); + ScrollViewer.BorderBrush = SystemColors.HighlightBrush; + } } public ScrollPolicy VerticalScrollPolicy @@ -122,7 +154,7 @@ namespace Xwt.WPFBackend vscrollControl = vbackend = new ScrollAdjustmentBackend (); hscrollControl = hbackend = new ScrollAdjustmentBackend (); } - ScrollViewer.Content = new CustomScrollViewPort (widget.NativeWidget, vbackend, hbackend); + ScrollViewer.Content = new CustomScrollViewPort (widget.NativeWidget, ScrollViewer, vbackend, hbackend); ScrollViewer.CanContentScroll = true; if (vbackend != null) @@ -169,6 +201,16 @@ namespace Xwt.WPFBackend } } + protected override void Dispose (bool disposing) + { + if (ScrollViewer != null) { + ScrollViewer.GotKeyboardFocus -= ScrollViewer_GotKeyboardFocus; + ScrollViewer.LostKeyboardFocus -= ScrollViewer_LostKeyboardFocus; + } + + base.Dispose (disposing); + } + protected ScrollViewer ScrollViewer { get { return (ScrollViewer) Widget; } |