2010-11-11 10 views
35

Chciałbym użyć <Image> w mojej aplikacji WPF, która reaguje na kliknięcia myszą. Tylko zdarzenia "Mouse Up" i "Moue Down" są dostępne po wyjęciu z pudełka. Uważam to za dość szczególne. Czy istnieje sposób na rozszerzenie kontroli lub sposób użycia innej kontroli, aby dać ten sam efekt?Kontrola obrazu WPF z kliknięciem Event

+2

Umieść obraz wewnątrz przycisku zgodnie z http://stackoverflow.com/questions/2720463/creating-a-clickable-image-in-wpf – LosManos

+0

Spróbuj tego. VivekDev

Odpowiedz

67

Aby rozwinąć odpowiedź Shawna Mcleana, jedną z wielkich możliwości WPF jest możliwość wykorzystania zachowania kontrolki przy całkowitej zmianie wyglądu tej kontroli. Jeśli chcesz utworzyć obraz, który zachowuje się tak jak przycisk (wraz ze zdarzeniami kliknięcia, powiązaniem poleceń, domyślnym przypisaniem przycisków itp.), Możesz umieścić obraz w kontrolce przycisku i ponownie ustawić ten przycisk, aby usunąć przycisk "chrome". To da ci miłe API przycisku o pożądanym wyglądzie. Możesz ponownie użyć tego stylu, a to podejście zredukuje potrzebę tworzenia procedur obsługi zdarzeń w kodzie, jeśli masz polecenia związane z nowymi przyciskami graficznymi.

Tworzenie takiego stylu jest dość łatwe. Po prostu utwórz zasób nowego stylu z nazwanym kluczem w zasobie i przypisz ten zasób do właściwości Style swoich przycisków. Oto przykład wrzuciłem razem:

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="ButtonStyleTestApp.MainWindow" 
x:Name="Window" 
Title="MainWindow" 
Width="640" Height="480"> 

<Window.Resources> 
    <Style x:Key="NoChromeButton" TargetType="{x:Type Button}"> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
     <Setter Property="HorizontalContentAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
     <Setter Property="Padding" Value="1"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid x:Name="Chrome" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
        </Grid> 
        <ControlTemplate.Triggers>       
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" Value="#ADADAD"/> 
          <Setter Property="Opacity" TargetName="Chrome" Value="0.5"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

<Grid x:Name="LayoutRoot" Background="#FF44494D"> 
    <Button Style="{DynamicResource NoChromeButton}" Click="ButtonClicked" > 
     <Image Source="Desert.png" Stretch="None"/> 
    </Button> 
</Grid> 
</Window> 
29

Użyj MouseUp. Nie można przejść do kontroli obrazu ani skupić się na niej, dzięki czemu jest to jedyny sposób, aby go kliknąć.

Inną opcją jest po prostu wstawienie obrazu do przycisku i usunięcie wszystkich stylów poprzez edycję szablonu sterowania, aby wyglądało jak zwykłe zdjęcie. W ten sposób możesz skupić się na nim za pomocą klawiatury.

+6

Focusable = "True" – clamchoda

+1

+1 dla MouseUp. – Rahul

+3

Nie używaj zdarzenia MouseUp zamiast zdarzenia Click - w ten sposób Twoja aplikacja może nie działać z wyłączonymi narzędziami ułatwień dostępu. –

1

Można użyć zestawu 4 ładowarki i 2 zmiennych logicznych:

logicznych:

  1. IsClicked
  2. IsEntered

kopiarki:

  1. OnMouseDown- zestawy IsClicked true;
  2. OnMouseEnter- sets Is Isnted true;
  3. OnMouseLeave - ustawia IsEntered false;
  4. OnMouseUp - if (IsClicked & & IsEntered) {/ Todo logiki /}, a następnie ustawia IsClicked false;

Ta konstrukcja implementuje funkcjonalność klasycznego kliknięcia.

-1
  1. OnMouseLeave - również set isClicked to false; W przeciwnym razie możesz kliknąć myszką i zwolnić mysz. Następnie kliknij myszką i zwolnij przycisk myszy, aby wykonać kliknięcie.