2014-02-17 59 views
0

我的問題是我有一張圖像代表一個平面,一個矩形代表捕獲並保存爲圖像的區域。但是當他們在WPF中移動時,即使他們被告知以相同的速度前進,他們仍會以不同的速度移動。在WPF c中將圖像和矩形分組在一起c#

有沒有一種方法可以將它們在一些標籤中組合在一起,以便它們被視爲一個對象,但同時分開?我需要它們分開,因爲矩形的大小應該能夠改變飛機的圖像不應該在哪裏。

XAML:它背後

<Rectangle x:Name="rect" Fill="RED" HorizontalAlignment="Left" Height="89" Stroke="Black" VerticalAlignment="Top" Width="117" Margin="349,204,0,0"/> 
<Image x:Name="planeIMG" Source="plane.PNG" Height="75" Width="75" Margin="367,213,369,335"/> 

代碼走左邊(這是相同的其他人)

if ((Keyboard.GetKeyStates(Key.A) & KeyStates.Down) > 0) 
     { 
      Console.WriteLine("Test left key is pressed "); 
      rect.Margin = new Thickness(rect.Margin.Left -10 , rect.Margin.Top, rect.Margin.Right, rect.Margin.Bottom); 
      planeIMG.Margin = new Thickness(planeIMG.Margin.Left -10, planeIMG.Margin.Top, planeIMG.Margin.Right, planeIMG.Margin.Bottom); 
     } 

提前

+1

只是將它們嵌入「Grid」 –

回答

0

就像克里斯W.提到非常感謝:只需把他們放在一個網格中。

我建議你在使用WPF時嘗試移動MVVM模式,並冒昧地寫一點樣本。爲移動項目定義一個視圖模型(這是一個包含圖像和矩形的網格)。

class MovingItemViewModel : INotifyPropertyChanged 
{ 
    public Thickness Margin { get; set; } 
    public String Data { get; set; } 

    public ICommand MoveRightCommand { get; set; } 

    public MovingItemViewModel() { 
     Margin = new Thickness(0, 0, 0, 0); 
     Data = "Hello!"; 
     MoveRightCommand = new RelayCommand(param => MoveRight()); 
    } 

    public void MoveRight() { 
     Console.WriteLine("Right Key is pressed!"); 
     double offset = Margin.Right - 10; 
     Margin = new Thickness(0, 0, offset, 0); 
     OnPropertyChanged("Margin"); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

這裏我使用RelayCommand類將用戶輸入路由到viewmodel。您可以閱讀更多關於RelayCommand的信息here. INotifyPropertyChanged用於通知視圖模型中的更改視圖。

在您的視圖中,可能只是主窗口,您可以通過鍵綁定調用MoveRight方法。網格的位置綁定到視圖模型的邊緣屬性。

<Window.InputBindings> 
    <KeyBinding Command="{Binding Path=MoveRightCommand}" 
    Key="Right" ></KeyBinding> 
</Window.InputBindings> 
<Grid> 
    <Grid Margin="{Binding Thickness}" Height="100" Width="100" Background="Blue"> 
     <Label Content="I like to move it!" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" Width="100"/> 
     <TextBox HorizontalAlignment="Left" Height="23" Margin="0,41,0,0" TextWrapping="Wrap" Text="Move it!" VerticalAlignment="Top" Width="100"/> 
    </Grid> 
</Grid> 

如果您願意,您可以用圖像和矩形替換標籤和文本框。

最後,在視圖的代碼後面定義datacontext。

public MainWindow() 
    { 
     InitializeComponent(); 
     MovingItemViewModel vm = new MovingItemViewModel(); 
     DataContext = vm; 
    } 

這不僅意味着回答您的問題(我希望它的確如此),而且還能讓您快速瞭解MVVM。網絡上有很多更深入的信息。