C# wpf user control click esemény kezelése

C# wpf user control click esemény kezelése
2015-11-26T18:45:16+01:00
2015-11-27T12:03:07+01:00
2022-12-03T02:00:35+01:00
sirály12
Üdvüzletem.

Egy problémával fordulnék hozzátok.
Egy saját készítésű user controlt próbálok működésre bírni, ami nem igazán úgy megy, ahogy szeretném.
Az user control nem bonyolult, csak egy háromszög van rajta.
Próbálnám megoldani, hogy a click eseményt átadja a főformnak, de ez nem megy.
A controlon nincs button, ez némi nehezítés. Ez fontos lenne, hogy ne is legyen.
A kattintás érzékelése rendben van, mert a
private void Haromszog_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
esemény rendben lefut, a háromszög szint vált.

A példát a click esemény átadására a neten találtam, elvileg működőképes.

Tehát a kérdés, mit rontok el?

Az user control forrása:

<UserControl x:Class="WpfApplication3.Haromszog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApplication3" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <Path Stroke="Black" HorizontalAlignment="Left" VerticalAlignment="Top" StrokeThickness="1" Name="Sokszog" Canvas.Left="1.343" Canvas.Top="26.866" Height="300" Stretch="Fill" Width="300" RenderTransformOrigin="0.462,0.514" Margin="0,0,0,0" Opacity="0.85" MouseLeftButtonUp="Haromszog_MouseLeftButtonUp" MouseLeftButtonDown="Haromszog_MouseLeftButtonDown" Fill="Red"> <Path.Data> <PathGeometry > <PathGeometry.Figures> <PathFigureCollection > <PathFigure StartPoint="0,0"> <PathFigure.Segments> <PathSegmentCollection > <PolyLineSegment Points="60,0"/> <PolyLineSegment Points="60,25"/> </PathSegmentCollection> </PathFigure.Segments> </PathFigure> </PathFigureCollection> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path> </Grid> </UserControl>
A hozzá tartozó c# fájl:

namespace WpfApplication3 { public partial class Haromszog : UserControl { public Haromszog() { InitializeComponent(); } public static readonly RoutedEvent AddClickEvent = EventManager.RegisterRoutedEvent("AddClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Haromszog)); public event RoutedEventHandler AddClick { add { AddHandler(AddClickEvent, value); } remove { RemoveHandler(AddClickEvent, value); } } void RaiseAddClickEvent() { RaiseEvent(new RoutedEventArgs(AddClickEvent)); } private void Haromszog_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { this.sokszog.Fill = new SolidColorBrush(Colors.Aqua); RaiseAddClickEvent(); } private void Haromszog_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { } } }

A gondom az, hogy a főprogramban, ha duplán kattintok az objektumra akkor csak ezt hajlandó hozzáadni:
        private void Haromszog_Loaded(object sender, RoutedEventArgs e)
        {}

Ha ide beteszem a következő sort:
       Haromszog.AddHandler(UIElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(Haromszog_Click), true);

És beírom ezt, akkor lehet kattintani, de kicsit összevissza lesz tőle a program.
private void Haromszog_Click(object sender, MouseButtonEventArgs e)
{}

Elnézést, ha kicsit zavarosan írok, a programozást hobbi szinten űzöm, a szakkifejezések nem az erősségeim.
Előre is köszönöm a segítséget.
Mutasd a teljes hozzászólást!
Szia,
[OP]Destroy-man neve eszembe juttatta, hogy Ő is kérdezett egyszer ilyesmit. :)
Mutasd a teljes hozzászólást!

  • Most ideiglenesen úgy oldottam meg, hogy a főprogram mainwindow() InicilaizedComponent() része után beteszem annyiszor (persze módosítva) ezt
    Haromszog.AddHandler(UIElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(Haromszog_Click), true);
    ahányszor csak kell.

    De gondolom biztosan létezik erre szebb megoldás is.
    Mutasd a teljes hozzászólást!
  • És mi lenne a cél? Az, hogy a fő view-ben (formról ugyanis nem beszélhetünk WPF esetén, az csak WinFormsban van), tudd állítani a háromszög színét?

    Ha igen, akkor ebből a háromszögből egy buttont kell készítened, amit a legegyszerűbben úgy tudsz megoldani, hogy a button template-jét agyonvágod a mostani háromszöggel. A UserControlban csinálsz két dependency propertyt, az egyik egy ICommand lesz, a másik meg egy Brush. Az ICommand mondja meg, hogy esemény fog történni, a Brush pedig a kitöltés színét határozza meg. Amit ezeknek adsz nevet, el fogod érni a fő viewben lévő usercontrol alól, mint tulajdonság. Ezeket pedig csak rákötöd az ott megírt kódra.
    Mutasd a teljes hozzászólást!
  • A cél az lenne, hogy a fő view-ben ha több ilyen usercontrolt helyezek el, akkor csak egyszerűen kattinthatóak legyenek, vagyis legyen click tulajdonságuk.
    Mert most hiába rakom fel őket, és hiába írom be ezt:

    private void Haromszog_Click(object sender, RoutedEventArgs e) {}
    Erre nem történik semmi.
    Csak ha a főview-ben mindig egy ilyen sort is beteszek az inicializecomponenthez:

    Haromszog.AddHandler(UIElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(Haromszog_Click), true);

    Tehát egy click eventet kellene hozzáadnom valahogyan, hogy az működjön is.
    Mutasd a teljes hozzászólást!
  • Szia,
    [OP]Destroy-man neve eszembe juttatta, hogy Ő is kérdezett egyszer ilyesmit. :)
    Mutasd a teljes hozzászólást!
  • Igen, én ott tanultam meg ennek a használatát. :) Hasznos segítség volt, azóta már sokfelé használom ezt a megoldást. ;)
    Mutasd a teljes hozzászólást!
  • Felejtsd el a click eseményt, helyette használj ICommandot, és a kódot ne a View-hez tartozó kódba írd be, hanem használj helyette ViewModelt.
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget mindenkinek.

    Ez a megoldás tökéletes nekem, mert csak egyszer kell hozzáadnom és bármelyik lerakott controlom kattintására lefut.
    Pont ilyesmire gondoltam.

    A ViewModellt pedig még megnézem, biztosan hasznát fogom venni más téren.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd