2012-09-28 17 views
5

Ne yapmak isterim, ızgaraya tıklandığında bir şeylerin olduğu bir ızgara içeren bir bölüm içeren bir UserControl. Tıklamanın gerçekleştiği pikselin konumuna ihtiyacım var ve tüm bu MVVM stilini yapıyorum. benim ViewModel eylemleri isteyebilir biliyorum:Komut ciltleme üzerinde tıklama pozisyonu alın

<Grid> 
<Grid.InputBindings> 
    <MouseBinding Gesture="LeftClick" Command="{Binding MinimapClick}"/> 
</Grid.InputBindings> 
</Grid> 

Benim sorunum Koordinatları ... herhangi bir fikir nasıl alınacağını bilmiyorum şimdi? Yardımlarınız için minnettarım!

+0

(http://meta.stackexchange.com: Başvuru için

, benim XAML şöyle görünür/sorular/5234 /). –

cevap

5

Bu nasıl?

private void MinimapClick(object parameter) 
{ 
    Point mousePos = Mouse.GetPosition(myWindow); 
} 

pencerenin bir başvuru yoksa parametre olarak göndermek (veya ne istersen referans noktası kullanın) başladı.

+0

İyi fikir! Bu beni doğru yolda buldu ... Cevabımdaki çözümümü biraz daha ayrıntılı olarak ele alacağım. Yardım için teşekkürler! Bu beta vulgaris için –

12

KDiTraglia benim için doğru işarete sahipti ... Her halükarda, eylemleri tanımlamak ve ViewModel'imle bağlantı kurmakla ilgili bazı sorunlar yaşadım. Bir başkasının bazı sorunları olması durumunda çözümüm göndereceğim. İşte xaml yaptık ne:

<Grid Width="100" Height="100" Grid.Column="2" Grid.Row="2" x:Name="TargetGrid"> 
    <Grid> 
     <Grid.InputBindings> 
      <MouseBinding Gesture="LeftClick" Command="{Binding Path=TargetClick}" CommandParameter="{Binding ElementName=TargetGrid}" /> 
     </Grid.InputBindings> 
    </Grid> 
</Grid> 

Ben UserControl oluşturmak ve ViewModel bağlamak. ViewModel ben uygulamak ve aşağıdaki komutu oluşturun:

public class PositioningCommand : ICommand 
{ 
    public PositioningCommand() 
    { 
    } 

    public void Execute(object parameter) 
    { 
     Point mousePos = Mouse.GetPosition((IInputElement)parameter); 
     Console.WriteLine("Position: " + mousePos.ToString()); 
    } 

    public bool CanExecute(object parameter) { return true; } 

    public event EventHandler CanExecuteChanged; 
} 

public PositioningCommand TargetClick 
{ 
    get; 
    internal set; 
} 
+0

teşekkürler! – Aralox

+0

Teşekkürler adamım. U zamanımı kurtardı! – shanmugharaj

+0

Teşekkürler bayım. Bu olağanüstü bir cevaptı. – sagneta

0

ben ilgili sorunu vardı - Benim ContextMenu için tıklayın olayları için fare pozisyonunu yakalamak istedi. Sorun: menümün ana (bir görüntü denetimi) CommandParameter ElementName tarafından tanınmadı. ,

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=imgArena'. BindingExpression:(no path); DataItem=null; target element is 'MenuItem' (Name='mnuAddItem'); target property is 'CommandParameter' (type 'Object') 

Görünüşe WPF bağlam menüleri kontrolünüz farklı bir görsel ağaca ait oldukça bağlayıcı hale: ad benim menü ekleme referans için

, aldığım bağlama hatası, önce oldu sinir bozucu.

Bazı araştırma sonra ben arkasında benim kodu için yapıcı yerleştirilen bu basit düzeltme, bulunan: "mnuGrid" Benim bağlam menüsünden adıdır

NameScope.SetNameScope(mnuGrid, NameScope.GetNameScope(this)); 

.

Bunu yaptıktan sonra, benim kontrolümün tam olarak benim de Beta Vulgaris'in yukarıda yaptığı gibi benim komutuma bir parametre olarak geçebildim. i [bu yazı] doğru yönlendirmek istiyoruz cevapları kabul bilmeyen durumda

<Image Name="imgArena" > 
     <Image.ContextMenu> 
      <ContextMenu Name="mnuGrid"> 
       <MenuItem Header="Place _Entry" Name="mnuAddItem" 
        Command="{Binding AddEntryCmd}" 
        CommandParameter="{Binding ElementName=imgArena}" /> 
      </ContextMenu> 
     <Image.ContextMenu> 
    </Image> 
+0

Düzenleme: Bunun işe yarayacağını düşündüm, ama ne yazık ki, X ve Y koordinatları, bağlam menüsünü başlatmak için sağ tıklattığım görüntüde değil, bağlam menümde bulunan * son * tıklama olayıyla ilişkilidir . – ActualRandy

+0

Geç olduğunu biliyorum ama ...Farenin koordinatlarını gönderen ve bunları bir değişkene kaydeden görüntünün sağ tıklatılmasıyla ilgili bir komut çağırırsınız ve AddEntryCmd'iniz tetiklenirse bu kaydedilmiş koordinatları kullanın. –

İlgili konular