티스토리 뷰
OneSearch에 처음 플립뷰를 이용해서 이미지 뷰어를 만들었을 때.. 핀치 줌을 사용해서 이미지를 확대/축소를 하고 싶었는데.. 간단하게 처리가 되지 않았서 그냥 다음에 하지머..하고 넘어간적이 있었다.
얼마전, 다른 앱을 작업하다가 핀치 줌을 이용해야 하는 경우가 다시 발생해서 떡 본김에 제사 지낸다고, 그냥 만들었다. 음 물론 시간은 4-5시간 정도 걸린 것 같다.
0. 환경
Windows 10, Visual Studio 2015
1. MainPage.xaml
x:Class="FlipViewSample.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:FlipViewSample"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:commons="using:FlipViewSample.Commons"
mc:Ignorable="d">
<Page.Resources>
<DataTemplate x:Key="DataTemplate1">
<ScrollViewer x:Name="scrollViewer" ZoomMode="Enabled"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<Image Stretch="None" Source="{Binding PhotoUri}" Tag="{Binding PhotoUri}">
<interactivity:Interaction.Behaviors>
<commons:ImageBehavior ZoomScrollViewer="{Binding ElementName=scrollViewer}"/>
</interactivity:Interaction.Behaviors>
</Image>
</ScrollViewer>
</DataTemplate>
</Page.Resources>
<Page.DataContext>
<local:MainPageViewModel/>
</Page.DataContext>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<FlipView x:Name="flipView" ItemsSource="{Binding PhotoList}" ItemTemplate="{StaticResource DataTemplate1}" ManipulationMode="TranslateX"/>
</Grid>
</Page>
FlipView에 ManipulationMode="TranslateX"를 지정하는 것이 중요하다. FilpView는 가로 방향의 제스처에만 반응하도록 만들어야 한다.
ScrollViewer에는 위에 굵은 글씨들의 내용을 꼭 추가해 줘야한다.
2. ImageBehavior.cs
}
{
// Using a DependencyProperty as the backing store for ScrollViewer. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ScrollViewerProperty =
DependencyProperty.Register("ZoomScrollViewer", typeof (ScrollViewer), typeof (ImageBehavior),
new PropertyMetadata(null));
/// <summary>
/// 중복실행 방지
/// </summary>
private bool _isWork;
/// <summary>
/// 중복실행 방지
/// </summary>
private readonly object _lock = new object();
public ScrollViewer ZoomScrollViewer
{
get { return (ScrollViewer) GetValue(ScrollViewerProperty); }
set { SetValue(ScrollViewerProperty, value); }
}
public void Attach(DependencyObject associatedObject)
{
if (!(associatedObject is Image)) return;
var im = (Image) associatedObject;
AssociatedObject = im;
im.ImageOpened += Im_ImageOpened;
if (ZoomScrollViewer == null) return;
ZoomScrollViewer.SizeChanged += ZoomScrollViewer_SizeChanged;
}
public void Detach()
{
var im = (Image) AssociatedObject;
im.ImageOpened -= Im_ImageOpened;
if (ZoomScrollViewer == null) return;
ZoomScrollViewer.SizeChanged += ZoomScrollViewer_SizeChanged;
}
public DependencyObject AssociatedObject { get; private set; }
private void ZoomScrollViewer_SizeChanged(object sender, SizeChangedEventArgs e)
{
SizeChanged();
}
/// <summary>
/// 이미지가 열렸을 때 기본 크기 변경
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Im_ImageOpened(object sender, RoutedEventArgs e)
{
SizeChanged();
}
private void SizeChanged()
{
lock (_lock)
{
if (_isWork) return;
_isWork = true;
}
if (ZoomScrollViewer == null) return;
var im = (Image) AssociatedObject;
//이미지 사이즈에 맞춰서 줌팩터 조정
var w1 = Convert.ToSingle(ZoomScrollViewer.ViewportWidth/(im.ActualWidth + 40.0f));
var h1 = Convert.ToSingle(ZoomScrollViewer.ViewportHeight/(im.ActualHeight + 40.0f));
Debug.WriteLine("ZoomFactor w1={0}, h1={1}", w1, h1);
var zoomFactor = Math.Min(w1, h1);
if (Math.Abs(ZoomScrollViewer.ZoomFactor - zoomFactor) > 0)
{
ZoomScrollViewer.ChangeView(0, 0, Math.Min(w1, h1));
}
_isWork = false;
}
}
전체 소스는 첨부 파일을 참고한다.
3. 실행 화면
4. 이미지를 앱에서 표시할 때 가장 좋은 선택은 이미지의 경로를 문자열 만들고, 그 것을 Image.Source에 바인딩을 하는 것이 좋다.
'Windows 10&11' 카테고리의 다른 글
다양한 Windows 10 UWP app template을 이용하기 (0) | 2015.12.23 |
---|---|
Display driver stopped responding and has recovered (0) | 2015.11.24 |
DynamicObject를 이용한 Resource 문자열 관리 (0) | 2015.10.02 |
Windows 10 UWP app 리젝 사유와 해결 방법 (0) | 2015.09.17 |
Todo list Universal & UWP app (0) | 2015.09.16 |
- Total
- Today
- Yesterday
- Bot Framework
- Cross-platform
- .net
- XAML
- uno platform
- visual studio 2019
- Always Encrypted
- LINQ
- Windows 10
- WPF
- MVVM
- ComboBox
- windows 11
- kiosk
- #uwp
- .net 5.0
- #prism
- Visual Studio 2022
- C#
- Behavior
- #MVVM
- dotNETconf
- Microsoft
- PRISM
- ef core
- Build 2016
- #Windows Template Studio
- UWP
- uno-platform
- IOT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |