2016-12-12 3 views
2

클릭하면 도구 설명을 표시해야하는 탐색 명령이 있습니다 (사용하지 않는 이유를 사용자가 알 수 있도록). 문제는 내 xaml 파일의 TouchDown 이벤트를 내 viewmodel로 전달하는 방법을 모른다는 것입니다. command.xaml.cs에서 이벤트를 만드는 대신 바인딩 할 수있는 방법이 있습니까?단추를 클릭 할 때 도구 설명 단추를 사용할 수 없습니다.

명령은 다음과 같이 구성됩니다. 하나의 CommandButton.xaml과 CommandButton.xaml.cs가 있는데 버튼을 설정하는 모든 것은 VM (텍스트, 이미지, 명령 실행 코드 등)에 의해 아래 예와 같이 처리됩니다.

<Button Focusable="True" Name="Btn1" Command="{Binding CommandToExecute}" Tag="{Binding Text}" Foreground="{x:Null}" Style="{DynamicResource ButtonStyle}" ToolTipService.ShowOnDisabled="true" TouchDown="Btn1_OnTouchDown" > 
    <Button.ToolTip> 
     <StackPanel> 
      <TextBlock>Test</TextBlock> 
      <TextBlock>Load stencil, or not your choice.</TextBlock> 
     </StackPanel> 
    </Button.ToolTip> 
    <shellModule:AutoGreyableImage Source="{Binding Image}" /> 
</Button> 

코드에 관해서는 다음과 같이 기본 명령 클래스에서 처리기 항목의 대부분을 사용하여 분할했습니다.

public abstract class BaseCommand : BindableBase 
{ 
    protected IModuleManager ModuleManager { get; set; } 

    protected IRegionManager RegionManager { get; set; } 

    protected BaseCommand(IRegionManager regionManager, IModuleManager moduleManager, string pageName = null) 
    { 
     RegionManager = regionManager; 
     ModuleManager = moduleManager; 
     Text = GetButtonText(pageName + "_BtnTxt"); 
     Image = (ImageSource)Application.Current.FindResource(pageName + "_BtnImg"); 
    } 

    private string _text; 

    private ImageSource _image; 

    public ICommand CommandToExecute => new DelegateCommand<object>(Command, Evaluate); 

    protected abstract void Command(object obj); 

    protected virtual bool Evaluate(object obj) 
    { 
     return false; 
    } 

    public string Text 
    { 
     get { return _text; } 
     set { SetProperty(ref _text, value); } 
    } 

    public ImageSource Image 
    { 
     get { return _image; } 
     set { SetProperty(ref _image, value); } 
    } 

    protected string GetButtonText(string key) 
    { 
     string uiString; 
     var locExtension = new LocTextExtension 
     { 
      Key = "Resources", 
      ResourceIdentifierKey = key 
     }; 
     locExtension.ResolveLocalizedValue(out uiString); 
     return uiString; 
    } 
} 

그런 다음 viewmodel에서 명령 특정 항목.

public class Page1CommandViewModel : BaseCommand, IPage1CommandViewModel 
{ 
    public Page1CommandViewModel(IRegionManager regionManager, IModuleManager moduleManager) : base(regionManager, moduleManager, PageNames.Page1) 
    { 
    } 

    protected override void Command(object obj) 
    { 
     Task.Run(() => 
     { 
      ModuleManager.LoadModule(ModuleNames.Page1Module); 
      RegionManager.RequestNavigate(RegionNames.ContentRegion, new Uri(PageNames.Page1, UriKind.Relative)); 
     }); 
    } 
} 

누구든지 올바른 방향으로 나를 가리킬 수 있다면 크게 감사하겠습니다.

+0

클릭하면 도구 설명이 이상합니다. 툴팁을 표시하는 패널의 버튼을 그냥 감싸는 것이 어떻습니까? 이 방법은 버튼 자체가 비활성화되어 있어도 보이게됩니다. – icebat

+0

응용 프로그램이 터치 스크린에서 실행되므로 마우스를 올려 놓지 않고 onclick이 필요한 이유입니다. – user3265613

+0

정말 '클릭'하지 않습니까? 도구 설명은 터치 UI에서 편리한 솔루션이 아닙니다. 이런 방식으로 정보를 표시해야하는 경우 버튼을 모두 사용하지 않도록 설정하고 사용자가 일부 조건에 따라 클릭 할 때 메시지를 표시하는 것이 좋을까요? – icebat

답변

0

많은 검색 결과를 얻은 후에 다른 사람들이 저를 올바른 방향으로 이끌어 준 의견에 부분적으로 감사드립니다. contentControl에서 내 버튼을 감싸고, 대신이 버튼에 툴팁을 적용했습니다.

<ContentControl MouseDown="ContentControl_MouseDown"> 
    <ContentControl.ToolTip> 
     <ToolTip Placement="Mouse" Content="Testing" /> 
    </ContentControl.ToolTip> 
    <Button Focusable="True" x:Name="Btn1" Command="{Binding CommandToExecute}" Tag="{Binding Text}" Foreground="{x:Null}" Style="{DynamicResource ButtonStyle}" ToolTipService.ShowOnDisabled="true"> 
     <shellModule:AutoGreyableImage Source="{Binding Image}" /> 
    </Button> 
</ContentControl> 

그리고 처리하기 위해 행사에 넣어 button.xaml.cs에

버튼의 타이밍 등 다음과 같은 위치에서 촬영

Timer Timer { get; set; } 
    ToolTip toolTip { get; set; } 

    public CommandButton() 
    { 
     InitializeComponent(); 
     Timer = new Timer {Interval = 3000}; 
     Timer.Elapsed += OnTimerElapsed; 
    } 

    private void CloseToolTip() 
    { 
     if (toolTip != null) 
     { 
      toolTip.IsOpen = false; 
     } 
    } 

    private void OnTimerElapsed(object sender, ElapsedEventArgs e) 
    { 
     Timer.Stop(); 
     Application.Current.Dispatcher.BeginInvoke((Action)CloseToolTip, DispatcherPriority.Send); 
    } 

    private void ContentControl_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     toolTip = ((ToolTip)((Control)sender).ToolTip); 
     toolTip.IsOpen = true; 
     Timer.Start(); 
    } 

타이머를 클릭합니다.

https://social.msdn.microsoft.com/Forums/vstudio/en-US/9e3eb4ab-ed0f-40ad-ad47-a1fff8e0fe8d/tooltips-in-wpf-touch-applications?forum=wpf

는 버튼을 비활성화 할 수 있으며, 툴팁은 여전히 ​​클릭에 표시 할 수 있습니다. 지금해야 할 일은 바인딩의 툴팁 내용을 마무리하고 호버 (필요하지 않음)의 툴팁을 비활성화하는 것입니다. 모두 해결되었습니다.

더 나은 해결책이 제시 될 수 있지만 당분간은 질문을 남겨 두십시오.

+0

글쎄, 이것이 이상적인 해결책이 아님이 밝혀졌습니다. 바인딩으로 작업 할 수있는 툴팁을 가져올 수 없습니다. 텍스트가 전달되지 않아 조금 더 살펴볼 필요가 있습니다. – user3265613

+0

아, ContentControl에 툴팁 = {Binding blah}를 직접 설정하면 ContentControl.Tooltip 태그 안에있을 때 바인딩 할 때만 문제가 발생합니다. 차이점이 무엇인지 아직 모르겠지만, 제 목적을 위해 작동합니다. – user3265613

1

버튼을 비활성화하는 대신 버튼을 다른 방법으로 다시 지정하면 오류/툴팁 메시지가 표시됩니다. (그런 다음 매개 변수/변수에서 비활성의 원인을 나타내는 문자열을 전달할 수 있습니다.)

단추의 클래스/시각적 속성을 변경하여 사용하지 않도록 설정하는 것이 좋습니다.

+0

그래, 나는 그 문제를 해결할 잠재적 인 방법으로 생각했다.연기와 거울없이이 작업을 할 수있는 방법이 있었으면 좋겠지 만, 현재 대체 계획 (동료는 이미 동일한 방식으로 작동하는 작동하는 프로토 타입을 가지고 있습니다.) – user3265613

+0

예, 장소/생존 능력에 대한 전체 토론이 있습니다. 툴팁의 그곳에는 이상한 것처럼 보이지 않습니다. 표준이 될 것 같지 않습니다. 심지어 합법적 인 필요성이 있다는 의견도 있습니다. http://stackoverflow.com/questions/1737773/tooltips-in-the-era-of-touch – Del

+0

글쎄, 당신의 대답은 나를 좀 도와주었습니다. 저는 이제 버튼을 내용 컨트롤에 넣었습니다. 대신 내용 컨트롤을 도구 설명에 할당하십시오. 이 방법 버튼은 비활성화 될 수 있지만 콘텐츠 컨트롤은 여전히 ​​나를 위해 이벤트를 처리 할 수 ​​있습니다. – user3265613

관련 문제