2015-05-28 2 views
-1

Я пытаюсь добавить изображение на холст при нажатии кнопки клавиатуры:Добавить изображение на ключ нажимается

public MainWindow() 
{ 
    InitializeComponent(); 
} 

public void OnKeyDownHandler(object sender, KeyEventArgs e) 
{ 
    Image img = new Image(); 
     img.Source = new BitmapImage(new Uri("C:\\Users\\Public\\Pictures\\Sample Pictures\\Koala.jpg")); 

     Canvas.SetTop(img, 0); 
     Canvas.SetLeft(img, 0); 
     this.Content = img; 
} 

Вот является XAML:

<Canvas KeyDown="OnKeyDownHandler" HorizontalAlignment="Left" Height="166" Margin="118,89,0,0" VerticalAlignment="Top" Width="300"/> 

Но когда я нажимаю ключ ничего не происходит. Если я поместил тот же код в метод MainWindow, он загрузит изображение. Где я ошибаюсь?

+0

Поместите точку останова в OnKeyDownHandler и определите, запущено ли событие. Думаю, это не потому, что ваш холст не сфокусирован. – Filip

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1

Вы должны дать холст имя и сделать холст Focusable, а затем в конструкторе сосредоточиться на нем. Вот фрагмент кода

<Canvas KeyDown="OnKeyDownHandler" Focusable="True" HorizontalAlignment="Left" Height="166" Margin="118,89,0,0" VerticalAlignment="Top" Width="300" Name="myCanvas"/> 

Код За:

public MainWindow() 
    { 
     InitializeComponent(); 
     myCanvas.Focus(); //<-- Do this First 

    } 



    private void OnKeyDownHandler(object sender, KeyEventArgs e) 
    { 
     Image img = new Image(); 
     img.Source = new BitmapImage(new Uri("C:\\Users\\Public\\Pictures\\Sample Pictures\\Koala.jpg")); 

     Canvas.SetTop(img, 0); 
     Canvas.SetLeft(img, 0); 
     this.Content = img; 
    } 
-1

Я думаю, что Вы должны добавить вес + рост и добавить изображение в Canvas.Children

img.Width = value; 
img.Height = value; 
MyCanvas.Children.Add(img); 
1

Есть несколько пунктов:

  1. В вашем XAML вы должны дать ваш холст имя, так что вы можете относиться к нему от вашего кода. Затем вы можете использовать MainCanvas.Children.Add(img);
  2. , когда вы используете слово this, вы ссылаетесь на экземпляр класса - ваше окно, а не холст. this.Content= такой же, как и запись Content=, и поместит img на окно. это произойдет непосредственно непосредственно в конструкторе
  3. Последний момент - это фокус: ваш холст, как определено в xaml, не получает фокуса, и ваше событие не запускается. если вы добавите фон на холст, вы можете запустить MainCanvas_MouseDown. Даже с фоном вы не будете стрелять KeyDown.
  4. После того, как вы установите фокус на холсте и добавить Focusable="True" в XAML, 'KeyDown' будет срабатывать, а (как ответил уже другие)

XAML:

<Canvas Name="MainCanvas" Focusable="True" Background="AliceBlue" HorizontalAlignment="Left" Height="160" Margin="68,39,0,0" VerticalAlignment="Top" Width="192" KeyDown="MainCanvas_KeyDown" MouseDown="MainCanvas_MouseDown_1" > 

код:

public partial class MainWindow : Window 
{ 
    Image img = new Image { Source = new BitmapImage(new Uri("C:\\Users\\Public\\Pictures\\Koala.jpg")) }; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     MainCanvas.Focus(); 
     //this.Content = img; 
     //Content = img; //same as the above. you don't need to write "this". 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    {// will work even if canvas has no background 
     MainCanvas.Children.Add(img); 
    } 

    private void MainCanvas_KeyDown(object sender, KeyEventArgs e) 
    { 
     //event will not fire. Canvas does not get the focus 
     //if you must have KeyDown trigger the event, you need MainCanvas.Focus() in the constructor, and Focusable="True" in the XAML. 
     MainCanvas.Children.Add(img); 
    } 

    private void MainCanvas_MouseDown_1(object sender, MouseButtonEventArgs e) 
    { 
     //This event will only fire if the canvas can get the focus: e.g. if it has some background. 
     MainCanvas.Children.Add(img); //canvas control has the name MainCanvas inside the xaml 
     //the below will work, but place the image on the window, because "this" means the class instance, not the method or event you are in. 
     //this.Content = img; 
    } 
} 
Смежные вопросы