WP7 Tip: Pivot 컨트롤 전환 제스처 사용 하지 않 기
10135 단어 wp7
원문의 저자: James Ashley
WP7 커 뮤 니 티 에서 자주 묻 는 질문 은 Pivot 에 미끄럼 제스처 를 받 아들 일 수 있 는 컨트롤 (예 를 들 어 하나의 Slider) 을 설치 할 때 Pivot 컨트롤 자체 에 내 장 된 '손가락 으로 미끄러져 보기 전환' 기능 을 어떻게 사용 하지 않 습 니까?
이 문제 에 대해 마이크로소프트 표준 의 답 은 네가 이렇게 해 서 는 안 된다 는 것 이다.이것 은 '나 쁜 방법' (Bad Practice) 으로 사용자 체험 의 혼동 을 초래 할 수 있다.이러한 주장 의 전 제 는 사용자 가 문맥 에 따라 생각 하지 않 고 '미끄럼' 이라는 제스처 가 모든 페이지 에서 똑 같은 역할 을 할 것 이 라 고 가정 하 는 것 이다.이 답 은 듣 기 에 괜 찮 은 것 같 고, Pivot 에 Slider 가 내장 되 어 있 는 것 도 합리적이다.게다가 우 리 는 Slider 를 Pivot 안에 세로 로 놓 을 수 있다. 그러면 이 답 은 더욱 일리 가 있다.
그 나 저 나 WP7 TextBox 에 서 는 '누 르 고 미 끄 러 짐' 이라는 손짓 으로 커서 가 텍스트 상자 안에 있 는 위 치 를 조작 할 수 있 습 니 다.그렇다면 Pivot 컨트롤 에 TextBox 를 설치 하 는 것 은 나 쁜 사용자 체험 을 하 는 것 이 아 닐 까?'안 좋 은 방법' 이 라 고 할 수 있 을까요?제 가 어떻게 든 TextBox 도 세로 로 놓 아야 되 는 거 아니에요?그리고 Toggle Switch 컨트롤 (이 컨트롤 은 Silverlight for Windows Phone Toolkit 에서 온 것) 은 어떻게 해 야 합 니까?
미끄럼 이라는 손짓 은 휴대 전화 에 있어 서 매우 자주 사용 되 는 것 이다.WP7 에 대한 새로운 컨트롤 이 많이 사 용 됩 니 다.곧 출시 될 이 새로운 컨트롤 들 이 모두 Pivot 컨트롤 에 배치 되 지 않 는 다 면 너무 아 쉽 습 니 다.
본 고 는 다음 에 Pivot 에 가로로 놓 인 Slider 를 어떻게 놓 고 정상적으로 작 동 하 는 지 설명 한다.
쉽게 말 하면 이 일 을 해 내 는 관건 은 Pivot 의 IsHit TestVisible 속성 을 사용 하여 미끄럼 제스처 를 사용 하지 않 는 것 입 니 다.그리고 Touch 형식의 FrameReported 이 벤트 를 사용 하여 Pivot 의 미끄럼 제스처 를 언제 다시 사용 할 지 결정 합 니 다.
새 프로젝트 를 만 듭 니 다. 페이지 에 두 개의 PivotItem 을 포함 하 는 Pivot 컨트롤 을 추가 하고 하나의 PivotItem 에 Slider 를 추가 합 니 다.
지금 실행 하면 손가락 으로 Slider 를 움 직 일 때 Slider 의 Thumb 는 끌 릴 수 있 지만 동시에 Pivot 도 이동 하고 다른 보기 로 전환 할 수 있 습 니 다.
이 문 제 를 해결 하려 면 슬라이더 의 Manipulationstarted 이 벤트 를 처리 해 야 합 니 다. 이 속성 을 false 로 설정 하면 손가락 이 슬라이더 에서 미 끄 러 질 때 Pivot 가 비활성화 되 었 는 지 확인 할 수 있 습 니 다.
미끄럼 제스처 가 끝 난 후에 우 리 는 Pivot 를 다시 사용 해 야 합 니 다.이 일 은 Mouse Left Button Up 이벤트 의 Handler 에서 할 수 없습니다. 용기 의 IsHit TestVisible 이 false 로 설정 되 었 을 때, 그 안에 포 함 된 모든 다른 컨트롤 이 Mouse Left Button Up 이 벤트 를 촉발 할 수 없 기 때 문 입 니 다.우 리 는 그것 을 ManipulationComplete 사건 의 Handler 에 넣 어서 할 수 있 지만, 그렇게 하면 일부 일치 하지 않 는 행 위 를 초래 할 수 있다.
위의 두 가지 방안 을 제외 한 후에 우 리 는 비교적 밑 에 있 는 Touch API 를 사용 할 수 있 습 니 다. 이 제스처 가 Slider 에서 발생 했 을 때 Pivot 의 IsHittestVisible 속성 을 true 로 설정 할 수 있 습 니 다.이 이벤트 의 Handler 는 페이지 의 구조 함수 에 걸 수 있 습 니 다.
Touch.FrameReported += (s, e) =>
{
if (e.GetPrimaryTouchPoint(slider1).Action == TouchAction.Up)
{
pivot1.IsHitTestVisible = true;
}
};
<!--
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-->
다음은 관련 XAML 코드 입 니 다.
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<controls:Pivot HorizontalAlignment="Stretch" Margin="6,6,0,0"
Name="pivot1" Title="pivot"
VerticalAlignment="Top" Height="595">
<controls:PivotItem Header="item1">
<Grid>
<Slider Height="107" HorizontalAlignment="Left"
Margin="-4,109,0,0" Name="slider1"
VerticalAlignment="Top" Width="460"
SmallChange="1"
Maximum="100"
Value="30"
ManipulationStarted="slider1_ManipulationStarted" />
</Grid>
</controls:PivotItem>
<controls:PivotItem Header="item2">
<Grid />
</controls:PivotItem>
</controls:Pivot>
</Grid>
<!--
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-->
다음은 필요 한 배경 코드 입 니 다.
public MainPage()
{
InitializeComponent();
Touch.FrameReported += (s, e) =>
{
if (e.GetPrimaryTouchPoint(slider1).Action == TouchAction.Up)
{
pivot1.IsHitTestVisible = true;
}
};
}
private void slider1_ManipulationStarted(object sender
, ManipulationStartedEventArgs e)
{
pivot1.IsHitTestVisible = false;
}
<!--
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-->