2012-01-26 3 views
0

TextBlock 컨트롤이 포함 된 여러 테두리가 포함 된 사용자 정의 컨트롤이 있습니다. TextBlocks의 Text 속성은 내 ViewModel 객체의 데이터로 설정됩니다.명령과 메뉴

나는 UserControl을의 리소스에 대한 컨텍스트 메뉴의 몇 가지를 추가했습니다 : 내 TextBlocks에 상황에 맞는 메뉴에 대한 참조를 추가 한

<UserControl.Resources> 
    <ContextMenu x:Key="ContextMenu"> 
     <MenuItem Header="Copy Plate" Command="cs:CarSystemCommands.CopyPlateCommand" /> 
     <MenuItem Header="Search Plate" Command="cs:CarSystemCommands.SearchPlateCommand" /> 
    </ContextMenu> 
    <ContextMenu x:Key="TextBoxContextMenu"> 
     <MenuItem Header="_Copy"  Command="Copy" /> 
     <MenuItem Header="Copy Plate" Command="cs:CarSystemCommands.CopyPlateCommand" /> 
     <MenuItem Header="Search Plate" Command="cs:CarSystemCommands.SearchPlateCommand" /> 
    </ContextMenu> 
</UserControl.Resources> 

.

<UserControl.CommandBindings> 
    <CommandBinding Command="Copy"         CanExecute="CopyCommand_CanExecute" Executed="CopyCommand_Executed" /> 
    <CommandBinding Command="cs:CarSystemCommands.CopyPlateCommand" CanExecute="CopyCommand_CanExecute" Executed="CopyPlateCommand_Executed" /> 
</UserControl.CommandBindings> 

내가 지금까지이 모든 것을 두 가지 문제점이 있습니다 : 해당 UserControl에

<Border Background="#FFFFFF78" 
     BorderBrush="Black" 
     BorderThickness="2" 
     ContextMenu="{StaticResource TextBoxContextMenu}" 
     Grid.Column="0" 
     Margin="5,10,5,5"> 
    <TextBlock FontSize="18" 
       FontWeight="Bold" 
       HorizontalAlignment="Center" 
       Margin="5" 
       x:Name="Camera" 
       VerticalAlignment="Center" /> 
</Border> 

마지막으로 추가 한 CommbandBindings 예를 들면 다음과 같습니다이다

  1. I를 마우스 오른쪽 컨트롤을 클릭하면 메뉴가 표시되지만 선택 항목은 회색으로 표시됩니다. CopyCommand_CanExecute, CopyCommand_Executed 및 CopyPlateCommand_Executed 메서드의 시작 부분에 중단 점이 있습니다. 이 중단 점은 지금까지 단 한번의 실행으로 충돌했습니다. 왜 그들이 그 시간에 맞았는지는 알 수 없습니다. 매번 CanExecute 메서드가 호출되도록하려면 어떻게해야합니까?

  2. 중단 점에 도달 한 번에 인수의 원본 속성이 내가 생각했던 컨트롤이 아니 었습니다. 그것은 UserControl입니다. UserControl에서 TextBlock 중 어떤 이벤트가 발생했는지 알아야합니다. 어떻게해야합니까?

토니

편집 :

UserControl을도 ComboBox 컨트롤이 포함되어 있습니다. ComboBox를 드롭 다운 한 후 TextBlocks를 마우스 오른쪽 버튼으로 클릭하면 CanExecute 메서드가 실행된다는 것을 알았습니다. 콤보 박스에서 아무 것도 선택하지 않아도됩니다. 클릭 만하면됩니다.

ComboBox에서 내 코드가 수행하지 않을 수있는 아이디어가 있습니까?

다른 것은 ComboBox를 삭제 한 후 Execute 이벤트 인수의 OriginalSource가 ComboBox입니다. 여러 개의 TextBlock에 동일한 Copy 명령을 사용하고 싶습니다. 어떤 TextBlock의 텍스트를 클립 보드에 복사할지 알 수 있도록 어떤 Context Menu를 사용했는지 알아야합니다. 도움!

답변

0

이 문제는 내 코드에서 해결되었습니다. 문제는 XAML 프로세서가 명령 대상을 결정할 수 없다는 것입니다. 즉, 명령을 보낼 위치를 파악할 수 없습니다.

내 코드에서 코드를 사용하여이 문제를 해결할 수있었습니다. 나는 여전히 문제에 대한 XAML 수정에 관심이 있지만, 조사 할 시간이 없다. 그동안 내가 구현 한 솔루션은 잘 작동합니다.

관심이있는 사람들을 위해

, 여기에 명령의 대상으로 설정 내가 쓴 코드입니다 :

private void FixMenuItems(FrameworkElement element, Func<MenuItem, bool> condition) { 
    foreach (MenuItem menuItem in element.ContextMenu.Items) { 
     if (condition(menuItem)) { 
      menuItem.CommandTarget = this; 
     } 
    } 
} 

이 기능을 사용하려면, 당신은 당신이 시도하고 상황에 맞는 메뉴와 컨트롤에 대한 참조를 전달 메소드로 수정하면 MenuItem을 매개 변수로 사용하는 함수가 MenuItem's CommandTarget 속성을 현재 객체로 설정해야하는 경우 true를 반환합니다.

0

나는 내 문제에 대한 부분적인 대답을 발견했다. 내 코드가 ContextMenu에서 실행 된 TextBlock의 Copy 명령을 판별하는 방법을 알아 냈습니다. 이 명령이 필요한 세 개의 TextBlock에 대해 공통 ContextMenu를 사용하는 대신 각 TextBlock에 대해 별도의 ContextMenu를 만들었습니다. 그런 다음 복사하려는 속성의 이름이있는 CommandBarameter에 대한 복사 메뉴 항목에 CommandParameter를 추가했습니다. 그런 다음 CopyCommand_Executed 이벤트 처리기에서 e.Parameter 값의 값을 확인하고 적절한 컨트롤의 값을 클립 보드에 복사합니다. 이것은 잘 작동합니다.

그러나 ComboBox에서 항목을 선택할 때까지 CanExecute 이벤트가 발생하지 않는 문제가 남아 있습니다. 나는 아직도 이것을 알아낼 필요가있다.

편집 :

글쎄, 모든 것이 CanExecute 이벤트를 포함, 지금은 잘 동작하는 것

.나는 무언가를 깨뜨 렸을 것임에 틀림없는 다양한 것들을 시도했지만 CommandParameter가 작동 했으므로 다른 모든 것들은 괜찮아 보입니다. 나는 "대답으로이 표시려고하고

두 번째 편집 :...

음, 사실, 모든 것이 내가이를 게시 할 때 작업 한 UserControl을에 노력하고 있습니다하지만 여전히 문제가있다

UserControl을 위에서 언급 한

실제로 다른 UserControl을에 포함 된 첫 번째 UserControl을의 내용은 StackPanel에 포함된다. 나는 FocusScope으로 StackPanel의를 설정하고 그 모든 일을 시작하면 될 것으로 보인다

두 번째 컨트롤이 StackPanel에 있습니다. 루트와 그 안에있는 많은 그리드에서. 첫 번째 그리드 홀드 첫 번째 UserControl과 다른 것들. 아래 두 번째 Grid에는 ContextMenus를 가진 두 개의 DataGrid가 있습니다. 이 ContextMenus는 현재 작동하지 않습니다.

나는 StackPanel을 FocusScope로 만들었습니다. 첫 번째 UserControl의 컨텍스트 메뉴는 FocusScope로 만들지 않으면 작동하지 않으므로 하나뿐입니다. 마지막으로 두 개의 DataGrid에 FocusScope가있는 Grid를 만들었습니다.

문제는 FocusScopes와 관련이 있다고 생각하지만, 어떻게 관련이 있는지 전혀 알지 못합니다. 조합을 시도해 보았습니다. 어떤 아이디어?

관련 문제