Laden...

Forenbeiträge von Hans_Rakete Ingesamt 178 Beiträge

18.08.2012 - 22:22 Uhr
<Style BasedOn="{StaticResource {x:Type CheckBox}}" TargetType="{x:Type CheckBox}"/>

läuft. Danke.

18.08.2012 - 21:20 Uhr

Hallo,

vielen Dank für die Antwort, die trifft aber nicht auf die Frage zu.

<Style TargetType="{x:Type Button}"/>

davon soll abgeleitet werden.

18.08.2012 - 18:50 Uhr

Hallo liebe Gemeinde,

wenn ich im Rahmen einer Anwendung einen Style ohne Namen einbinde so wird dieser ja bekanntermaßen immer eingesetzt da wo nichts anderes definiert wird; es wird sozusagen mein Standardstyle für diesen Controltyp.

Manchmal nun kommt es aber vor das man lokal einen Style definieren muss um z.B. einen DataTrigger einzubinden. NUn wird aber wieder vom konventionellen Style ausgegangen; hätte mein "allgemeiner" Style einen Namen so könnte der lokale von diesem ableiten ...

Wie kann ich nun von einem unbeannten, Solution weit gültigen Style ableiten?

Vielen Dank und viele Grüße.

10.08.2012 - 15:00 Uhr

Hallo,

ich experimentiere gerade ein wenig mit Point-Animationen herum und stelle dabei fest, dass Duration scheinbar nicht akzeptiert oder übergangen wird; das folgende Beispiel müsste viel schneller "laufen" als es das tut. Jemand eine Idee warum das so ist?


 <Border Height="100" Width="100">
            <Path Stroke="Black" StrokeThickness="1" >
                <Path.Data>
                    <PathGeometry>
                        <PathGeometry.Figures>
                            <PathFigureCollection>
                                <PathFigure StartPoint="0,60">
                                    <PathFigure.Segments>
                                        <PathSegmentCollection>
                                            <LineSegment x:Name="z1"  Point="0,60" />
                                            <LineSegment x:Name="z2" Point="0,60" />
                                        </PathSegmentCollection>
                                    </PathFigure.Segments>
                                </PathFigure>
                            </PathFigureCollection>
                        </PathGeometry.Figures>
                    </PathGeometry>
                </Path.Data>
                <Path.Triggers>
                    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                        <BeginStoryboard>
                            <Storyboard>
                                <PointAnimation 
									Storyboard.TargetName="z1"	
									Storyboard.TargetProperty="Point" From="0,60"
									To="40,100" Duration="00:00:001" />
                                <Storyboard BeginTime="00:00:001">
                                    <PointAnimation 
									Storyboard.TargetName="z2"	
									Storyboard.TargetProperty="Point" From="40,100"
									To="100,60" Duration="00:00:001" />
                                </Storyboard>
                            </Storyboard>
                        </BeginStoryboard>

                    </EventTrigger>
                </Path.Triggers>
            </Path>
        </Border>

Viele Grüße.

03.08.2012 - 20:32 Uhr

Diese CombinedGeometry-Klasse ist schon nicht schlecht; allerdings lässt sich hier das Ergebnis leider nicht animieren; das wäre aber eben sehr schön ...

Im Prinzip ist es geau das was ich suche; die Eigenschaften der CombineGeometry-Klasse animierbar.

03.08.2012 - 14:42 Uhr

Schreibfehler meinerseits; sorry; ich meine natürlich eine "Freiform".

Form A (Anzahl Ankerpunkte beliebig) hat einen Überlappungsbereich mit Form B (Anzahl Ankerpunkte beliebig) -> angezeigt wird C (Überlappungsbereich).

Hintergrund wäre z.B. einen Kreis (Ellipse) in einen anderen neinzublenden und dabei einen ntransparenten hintergrund nutzen zu können.

Als Ausgangspunkt könnte man vielleicht den BorderGabMaskConverter nehmen, dazu müsste ich noch wissen wie man es in C# lösen kann - den Überlappungsbereich von zwei Elementen anzuzeigen.

03.08.2012 - 14:28 Uhr

Hallo,

ich suche gerade eine Möglichkeit eine richtige Maske zu erzeugen; also eine jene die eine beliebige Freiform dazu nutzen kann um nur den Deckungsbereich dieses von einem anderen Control anzuzeigen - also im Prinzip so wie man es aus Photoshop oder Illustrator kennt. So richtig fündig werde ich dazu nicht; ist euch dabei schon mal was zu deisem Thema über den Weg gelaufen?

Würde es vorzugsweise im XAML lösen wollen oder maximal einen Converter dazu nutzen.

Für Anregungen und Vorschläge bin ich sehr dankbar.

22.06.2012 - 14:16 Uhr

Hallo,

ich hab mir einen Style für einen ToggleButton gebaut in dem die Breite und Höhe mittels Triggern + Storybords beeinflusst wird. Soweit funktioniert das Ganze prima einziges unklares Phänomen was sich ergibt:

Nachdem ein ToggelButton einmal "Checked" war, wird das Storyboard für MOuseOver nicht mehr angestossen obwohl der Trigger selbst natürlich seinen Dienst noch verrichtet (Hintergrund wird grün). Kann mir jemand sagen warum das so ist?



	<Window.Resources>
		<Style x:Key="ToggleButtonStyle1" TargetType="{x:Type ToggleButton}">
			<Setter Property="Margin" Value="4"/>
			<Setter Property="Background" Value="red"/>
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="{x:Type ToggleButton}">
						<ControlTemplate.Resources>
							<Storyboard x:Key="Timeline1">
							<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="master">
									<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="40"/>
								</DoubleAnimationUsingKeyFrames>
								<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Width)" Storyboard.TargetName="master">
									<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="40"/>
								</DoubleAnimationUsingKeyFrames>
							</Storyboard>
							<Storyboard x:Key="Timeline2">
								<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="master">
									<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="24"/>
								</DoubleAnimationUsingKeyFrames>
								<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Width)" Storyboard.TargetName="master">
									<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="24"/>
								</DoubleAnimationUsingKeyFrames>
							</Storyboard>
						</ControlTemplate.Resources>
						<Grid x:Name="master" Background="{TemplateBinding Background}" Width="24" Height="24">
							<ContentPresenter HorizontalAlignment="center" VerticalAlignment="center"/>
						</Grid>
						<ControlTemplate.Triggers>
							<Trigger Property="IsMouseOver" Value="true">
								<Trigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource Timeline1}"/>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <BeginStoryboard Storyboard="{StaticResource Timeline2}"/>
                            </Trigger.ExitActions>
							<Setter Property="Background" Value="lightgreen"/>
							</Trigger>
							<Trigger Property="IsChecked" Value="true">
                            <Trigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource Timeline1}"/>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <BeginStoryboard Storyboard="{StaticResource Timeline2}"/>
                            </Trigger.ExitActions>
                        </Trigger>
						</ControlTemplate.Triggers>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
		</Style>
	</Window.Resources>

	<Grid x:Name="LayoutRoot">
		<StackPanel Orientation="Horizontal" >
			<ToggleButton Content="12" Style="{DynamicResource ToggleButtonStyle1}" />
			<ToggleButton Content="34"  Style="{DynamicResource ToggleButtonStyle1}" />
			<ToggleButton Content="56"  Style="{DynamicResource ToggleButtonStyle1}" />

		</StackPanel>
		
	</Grid>

15.06.2012 - 21:32 Uhr

und du must deinem parent-Element auch sagen dass es jetzt ein Grid hat welches dann angezeigt wird; also besipielsweise dem Window zuweisen.

15.06.2012 - 11:53 Uhr

Das Binding funktioniert nun so weit als das die Werte beim Start übergeben werden; eine aktualisierung der Werte über das Binding findet aber nicht statt.

(statt "Katze" ein Binding an "tier" - ändert sich "tier" im Betrieb der Anwendung so wird der Wert nicht in die Collection übergeben)

Warum verhält sich nun eine ObservableCollection aus DependencyPropertys anders als eine einzelene DependencyProperty??

14.06.2012 - 08:37 Uhr

Hallo,

um zwischen Oberfläche und einem abgleiteten Control zu kommunizieren habe ich eine ObservableCollection implementiert, diese wiederum enthält Elemente einer Klasse welche wiederum drei DependencyPropertys bereit stellt:


    public class element : DependencyObject
    {
        public string Bezeichnung
        {
            get { return (string)GetValue(BezeichnungProperty); }
            set { SetValue(BezeichnungProperty, value); }
        }
        public static readonly DependencyProperty BezeichnungProperty =
            DependencyProperty.Register("Bezeichnung", typeof(string), typeof(panel_cluster), new UIPropertyMetadata(string.Empty));

        public string Vorlage
        {
            get { return (string)GetValue(VorlageProperty); }
            set { SetValue(VorlageProperty, value); }
        }
        public static readonly DependencyProperty VorlageProperty =
            DependencyProperty.Register("Vorlage", typeof(string), typeof(panel_cluster), new UIPropertyMetadata(string.Empty));

        public bool HasChanges
        {
            get { return (bool)GetValue(HasChangesProperty); }
            set { SetValue(HasChangesProperty, value); }
        }
        public static readonly DependencyProperty HasChangesProperty =
            DependencyProperty.Register("HasChanges", typeof(bool), typeof(panel_cluster), new UIPropertyMetadata(false));
    }


    public class panel_cluster : Control 
    {
        #region DPs

        public ObservableCollection<element> Panels
        {
            get { return (ObservableCollection<element>)GetValue(PanelsProperty); }
            set { SetValue(PanelsProperty, value); }
        }
        public static readonly DependencyProperty PanelsProperty =
            DependencyProperty.Register("Panels", typeof(ObservableCollection<element>), typeof(panel_cluster), new UIPropertyMetadata(new ObservableCollection<element>()));

Im Xaml kann man dann, das entsprechende Template eingebunden, folgende Daten übergeben:


<local:panel_cluster Style="{StaticResource panel_cluster_template}">
                    <local:panel_cluster.Panels>
                        <local:element Bezeichnung="Hund" Vorlage="Hundehütte" HasChanges="false"/>
                        <local:element Bezeichnung="Katze" Vorlage="Körbchen" HasChanges="false" />
                   
                    </local:panel_cluster.Panels>
                </local:panel_cluster>

Das funktioniert prima. Ersetze ich aber nun eine der Eingaben zB. "Hund" durch ein Binding bekomme ich eine Exception:

"Binding" kann nicht für die Eigenschaft "Hund" vom Typ "Element" festgelegt werden."Binding" kann nur für eine "DependencyProperty" eines Dependency Objects" festgelegt werden.

Damit stehe ich ein wenig auf dem Schlauch, bei element handelt es sich doch um ein DependencyObject. Kann mir jemand helfen? Vielen Dank.

13.06.2012 - 19:26 Uhr

Hallo,

im Moment nutze ich folgende Konstruktion:



public class CWP_dp : Control
    {

        public string aenderungen
        {
            get { return (string)GetValue(aenderungenProperty); }
            set { SetValue(aenderungenProperty, value); }
        }
        public static readonly DependencyProperty aenderungenProperty =
            DependencyProperty.Register("aenderungen", typeof(string), typeof(CWP_dp), new UIPropertyMetadata(string.Empty, Aenderungen));

und im xaml:


<local:CWP_dp x:Name="ungleich" Style="{StaticResource Template_CWP}" aenderungen="{Binding Regelnummer}"/>

Was soweit mit dem entsprechenden Template sehr gut funktioniert. Nun habe ich aber sehr viele Verbindungen die auf diese Weise erfolgen, somit kam die Idee es mit einer Liste zu versuchen:


 public List<string> Namen
        {
            get { return (List<string>)GetValue(namenProperty); }
            set { SetValue(namenProperty, value); }
        }
        public static readonly DependencyProperty namenProperty =
            DependencyProperty.Register("Namen", typeof(List<string>), typeof(panel_cluster), new UIPropertyMetadata());

funktioniert auch, wie aber bekomme ich nun vom XAML aus mehrere Einträge in die Liste?

Vielen Dank und schönen Abend.

13.06.2012 - 13:18 Uhr

Hallo,

ich erstelle im Code ein WrapPanel und weise diesem Kinder unterschiedlicher Art (Border, TextBlock) zu, und möchte diese an anderer Stelle ansprechen, wie kann man auf die Kinder zugreifen?

Vielen Dank.

31.05.2012 - 12:48 Uhr

Hallo,

vielen Dank für die Antwort. Der Vorgang ist bekannt. einem Template ist aber eben auch nur eine Grafikadresse von außen zuzuführen (Beispielsweise über ContentTemplate), sobald es um zwei Angaben geht muss das Template immer wieder neu definiert werden, genau das versuche ich ja zu umgehen ...

31.05.2012 - 12:26 Uhr

Hallo,

Wenn ich mehrere Buttons habe, die sich alle nur dadurch unterscheiden, dass zwei Grafiken (Standard und MouseOver // schwarz-weiß und farbig) unterschiedlich sind so muss ich für jeden Button einen eigenen Style bzw. ein eigenes Template schreiben, denn es scheint unmöglich zwei Grafiken von "außen" an das Template zu übergeben - bei einer einzelenen Grafik hat es noch über ein ContentTemplate funktioniert, zwei Grafiken zu übergeben klappt aber nicht.

Was kann ich nun tun? Das Control Button abzuleiten und zwei eigene Propertys anfügen um zum Ziel zu gelangen oder gibt es einen einfacheren Weg?

Vielen Dnak + viele Grüße.

30.05.2012 - 09:16 Uhr

Hallo,

ich suche nach einem Weg wie man die CheckBox die in einem ListBoxItem bzw. dem Template steckt, mit einem Doppelklick automatisch auf "isChecked" setzen könnte.

Wie könnte man das lösen, gibt es eine reien XAML-Lösung dafür?

07.05.2012 - 14:34 Uhr

Hallo,
in einem Projekt gibt es eine Liste und einen "DetailView" in dem die nähren Informationen zu dem ausgewählten Datensatz der Liste angezeigt werden, für verschiedene Datentypen gibt es nun auch unterschiedliche Templates.

Im Moment erfolgt die Selektion mittels Converter (TemplateSelector), das Problem dabei ist, dass nicht automatisch neu geladen wird, folgen zwei Listeneinträge vom gleichen Typ aufeinander so wird das Template nicht neu geladen. Ich suche nach einer Lösung um genau das zu erreichen; die vorbereiteten Templates sollen immer neu geladen werden.

Eine Unterscheidung der Datentypen und dem entsprechenden Template, alternativ dem TemplateSelector, mittels DataTriggern brachte bisher auch keinen Erfolg.

Hat jemand eine Idee, wie man ein pauschales neu laden erzwingen könnte?

Vielen Dank + viele Grüße.

22.04.2012 - 16:21 Uhr

Hallo Talla,

vielen Dank für die Antwort.
demnach müsste ich also mit releaseMouseCapture() arbeiten!?

Wo genau kann ich diesen Befehl nun aber unterbringen damit er ausgelöst wird, werden doch die EventHandler wie MouseLeave nicht bedient aus angeführtem Grund.

Im Code prüfen ob die Maus noch über dem Objekt ist?

Vielen Dank für Hinweise.

22.04.2012 - 12:12 Uhr

Ein Stapel ToggleButtons kann IsChecked = true gesetzt werden wenn man mit der gedrückten Maustaste darüber fährt (Verwandtes Thema: ToggleButton aktivieren ohne ClickEreignis).

Nun funktioniert folgendes gut:


  <StackPanel>
            <ToggleButton Content="hier" MouseEnter="OnMouseEnterHandler1"/>
            <ToggleButton Content="hier" MouseEnter="OnMouseEnterHandler1"/>
            <ToggleButton Content="hier" MouseEnter="OnMouseEnterHandler1"/>
            <ToggleButton Content="hier" MouseEnter="OnMouseEnterHandler1"/>
            <ToggleButton Content="hier" MouseEnter="OnMouseEnterHandler1"/>
        </StackPanel>

EventHandler:


 void OnMouseEnterHandler1(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                ToggleButton absender = e.Source as ToggleButton;
                absender.IsChecked = true;
            }
        }

... aber nur wenn die gedrückte Maustaste aus einem Bereich kommt der nicht auf einem der ToggleButtons liegt. Beginnt man nun mit dem Drücken und ziehen des Mauszeigers über einem der ToggleButtons funktioniert die Lösung nicht, die weiteren TBs werden nicht aktiviert.

Der Grund dafür ist vermutlich der noch aktive Fokus des ToggleButtons auf dem gestartet wurde, damit werden alle anderen nicht aktiviert beim überfahren mit der Maus.
Ist dieser Grund richtig? Kann man das lösen, ist es möglich den Fokus beim verlassen eines Elements zu löschen?

21.04.2012 - 23:37 Uhr

Jup, im Code klappt's. Danke.

21.04.2012 - 21:18 Uhr

Hallo, vielen Dank für den Hinweis.

Dort wird zumindest erstmal erklärt warum es nicht funktioniert, eine Lösung gibt es also hier auch nicht (PreviewMouseLeftButtonDown - feuert ja nur wenn über dem Element die Taste der Maus gedrückt wird): Die Taste ist ja schon gedrückt bevor die Maus über dem Element ist und das eben abzufragen wenn die Maus über dem Objekt angekommen ist funktioniert demnach so nicht ...

Wie könnte man es anders lösen?

21.04.2012 - 19:42 Uhr

Hallo Talla,

danke für die schnelle Antwort, das Checked setzen bei MouseOver ist kein Problem, das geht relativ einfach, was ich aber eben einbinden möcht eich das "MausTasteDrücken und halten" und wenn dann das MOuseOver hinzukommt soll es "Checked" geben.

Es gibt noch EventName="MouseLeftButtonDown", das funktioniert aber so einfach wie hier beschrieben auch nicht, wird wohl nicht vom Control unterstützt!?

21.04.2012 - 19:03 Uhr

Hallo,

ich habe eine Reihe ToggleButtons die auch auf "aktiviert" gesetzt werden sollen wenn der Nutzer mit gedrückter Maustaste darüber fährt. Wie könnte man das realisieren, irgendwelche Ideen dazu? Eine reine XMAL Lösung würde ich bevorzugen.

Über EventTrigger funktioniert es wohl nicht, das ToggleButton-Control unterstützt den DRAGEnter Event nicht!?

Danke.

14.03.2012 - 14:15 Uhr

In einem CustomControl gibt es eine DependencyProperty DP die an einer TextBox gebunden ist. Es gibt eine Methode M_DP die den Inhalt der DP bearbeitet und in einer Liste L speichert. Eine weitere Methode M+ liest alle Werte der Liste aus, fügt sie zu einem String zusammen um diese dann auf DP zu schreiben.

Nun möchte ich erreichen, dass dieser Vorgang ausgeführt wird wenn der Nutzer den Inhalt der TextBox (DP) ändert. Ein automatischer Aufruf der Methode M_DP bei Änderung in DP scheidet aus weil diese sich ja immer wieder selbst aufrufen würde, es ist also notwendig die Benachrichtigung zu unterbrechen oder den automatischen Aufruf nur einmal zu starten.

Wie kann man es lösen? Vielen Dank für Eure Hilfe.

11.03.2012 - 12:12 Uhr

Hallo,

meine Datenquelle liefert mir einen String in dem zweistellige Zahlen durch Kommata getrennt. Nun möchte ich den string so weiter verarbeiten, dass ich daraus eine Liste bekomme (vozugsweise int). Wie macht man so etwas?

Im String kann es auch Angaben geben die Bereiche meinen (z.B. 14-18); dann sollte es natürlich so sein, dass auch die Zahlen koreekt in die Liste eingetragen werden (hier 14, 15, 16, 17, 18).

Stehe da ein bisschen auf dem Schaluch wie man es lösen könnte, vielelicht habt ihr ja einen Tip für mich? Vielen Dank.

10.03.2012 - 14:36 Uhr

Hallo,

nach einigen Wochen Arbeit sammeln sich in meinen Projekten immer wieder zahlreiche Styles, Templates und Brushes (XAML) an die möglicherweise gar keine Verwendung mehr finden im aktuellen Projektstand.

Gibt es nun eine Möglichkeit eine ResourcenDatei aufzuräumen, vielleicht sogar ein Automatismus?

Es händisch zu lösen um dann alle Programmvariationen durchzuspielen um auch sicher zu gehen, dass gelöschte Dinge nicht doch irgendwo verwendet werden ist überaus mühsam.

Vielleicht hat ja jemand eine Idee oder Erfahrung wie man es lösen könnte

07.03.2012 - 16:20 Uhr

Also Mode=TwoWay zu ergänzen bringt keine Änderung.

07.03.2012 - 15:32 Uhr

Hallo talla,

danke der Hinweise. Hab das mal korrigiert, funktioniert damit aber auch noch nicht.

07.03.2012 - 15:17 Uhr

Hallo,

ich habe eine DP:


public string Datenquelle
        {
            get { return (string)GetValue(DatenquelleProperty); }
            set { SetValue(DatenquelleProperty, value); }
        }
        public static readonly DependencyProperty DatenquelleProperty =
            DependencyProperty.Register("Datenquelle", typeof(string), typeof(schunter_control), new UIPropertyMetadata(string.Empty));

und übergebe im XAML Werte:


<local:schunter_control VerticalAlignment="Top" Datenquelle="ein Beispieltext"/>

das Funktioniert prima.
Warum aber funktioniert folgendes nicht (gleiche DP)?:


<local:schunter_control VerticalAlignment="Top" Datenquelle="{Binding Path=Text, ElementName=Quelle}">
<TextBox Name="Quelle" Text="Beispieltext"/>

Hat jemand eine Idee?

29.02.2012 - 19:22 Uhr

Hallo, vielen Dank für deinen Beitrag.

Was genau ist denn eine "saubere" und / oder "bedachte" Schachtelung? Wodurch zeichnet diese sich aus und welche Konstruktionen erfüllen diesen "Tatbestand" nicht, kannst du dazu etwas sagen?

Vielen Dank.

28.02.2012 - 22:27 Uhr

Hallo,

wie realisierst du das "zuweisen" statt dem neu Erstellen was ja der Standard ist?

Danke. Viele Grüße.

24.02.2012 - 10:00 Uhr

Das Problem tritt unabhängig von der Anzahl der Datensätze auf, also auch mit 20 Einträgen sit die Performance nicht wesentlich besser.

23.02.2012 - 23:32 Uhr

Hallo,

ich habe ein DataGrid in das über einen TemplateSelector verschiedene ContentControls in den DetailView geladen werden und diese wiederum aus verschiedenen ContentControls bestehen. Nun werden außerdem Storybords für das Öffnen und Schließen des DetailViews angestoßen.

Leider lässt nun die Performance bei der Ausführung sehr zu wünschen übrig. Die Eigenschaften vom DataGrid selbst bin ich schon alle durchgegangen (VirtualizingStackPanel.VirtualizationMode="Recycling" / VirtualizingStackPanel.IsVirtualizing="True" usw)

Nun habe ich mir mal das SDK Performance Profiling Tool etwas näher angeschaut und dabei festgestellt dass ein sehr großer Teil der Ressourcen von Dispatcher Invoke verbraucht wird. Das ist, im weitesten Sinne, eine Art Manager der Warteschlange!?

Dazu habe ich nun meine Frage; wie kann ich die Anwendung optimieren um der Methode Dispatcher Invoke "Arbeit" abzunehmen? Spielt die Verschachtelung der Elemente ineinander dabei eine Rolle?

Vielen Dank für Eure Anmerkungen.

20.02.2012 - 10:33 Uhr

Hallo,

ich habe ein DataGrid in dem der DetailView aus mehreren DataTemplates erstellt wird die verschachtelt sind. Nun möchte ich die Tastatursteuerung der Anwendung optimieren. Leider ist die Anlage des TaIndex nicht ausreichend, zeitweise wird das DataTemplate direkt angesprungen, nicht aber die Controls die in selbigem enthalten sind, wie kann ich das verhindern?

Beim Öffnen eines PopUps springt der Focus nicht automatisch in die erste TextBox, wie kann man das gewährleisten?

Gibt es generell Erfahrungne mit dem Thema, gibt es Literatur oder Linkempfehlungen?

Vielen Dank.

17.02.2012 - 10:31 Uhr

sieht vielversprechend aus, schau ich mir mal an. Vielen Dank.

17.02.2012 - 10:09 Uhr

Hi,

ist es möglich einen DoppelKlick mehrfach zu belegen, also eine Bedingung zu prüfen um darauf die entsprechende Aktion auszuführen?

Probiert habe ich mal:


<Grid x:Name="LayoutRoot">
		<Button x:Name="button" Content="Button" Margin="169,154,207,218" >
			<i:Interaction.Triggers>
				<i:EventTrigger EventName="MouseDoubleClick">
					<i:Interaction.Behaviors>
						<ei:ConditionBehavior>
							<ei:ConditionalExpression>
								<ei:ComparisonCondition LeftOperand="{Binding ElementName=rectangle, Path=Visibility}" Operator="Equal" RightOperand="Visible"/>
							</ei:ConditionalExpression>
						</ei:ConditionBehavior>
					</i:Interaction.Behaviors>
					<ei:ChangePropertyAction TargetObject="{Binding ElementName=rectangle}" PropertyName="Visibility">
						<ei:ChangePropertyAction.Value>
							<Visibility>Hidden</Visibility>
						</ei:ChangePropertyAction.Value>
					</ei:ChangePropertyAction>
				</i:EventTrigger>
				
				<i:EventTrigger EventName="MouseDoubleClick">
					<i:Interaction.Behaviors>
						<ei:ConditionBehavior>
							<ei:ConditionalExpression>
								<ei:ComparisonCondition LeftOperand="{Binding ElementName=rectangle, Path=Visibility}" Operator="Equal" RightOperand="Hidden"/>
							</ei:ConditionalExpression>
						</ei:ConditionBehavior>
					</i:Interaction.Behaviors>
					<ei:ChangePropertyAction  TargetObject="{Binding ElementName=rectangle}" PropertyName="Visibility">
						<ei:ChangePropertyAction.Value>
							<Visibility>Visible</Visibility>
						</ei:ChangePropertyAction.Value>
					</ei:ChangePropertyAction>
				</i:EventTrigger>
			</i:Interaction.Triggers>
		</Button>
		<Rectangle x:Name="rectangle" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="54" Margin="25,51,0,0" Stroke="Black" VerticalAlignment="Top" Width="110"/>
	</Grid>

Das funktioniert leider nicht, die beiden Trigger stehen sich vermutlich im Weg.
Gibt es andere Ideen wie man es lösen könnte? Reine XAML Lösung bevorzugt.

Vielen Dank.

16.02.2012 - 20:49 Uhr

okay, danke.

16.02.2012 - 20:28 Uhr

@talla:

wenn deine Erklärung stimmt, dann dürfte folgendes doch auch nicht funktionieren, oder?:


<Button x:Name="button" Content="Button" Margin="169,154,207,218" >
			<i:Interaction.Triggers>
				<i:EventTrigger EventName="MouseDoubleClick">
					<ei:ChangePropertyAction TargetObject="{Binding ElementName=rectangle}" PropertyName="Visibility">
						<ei:ChangePropertyAction.Value>
							<Visibility>Collapsed</Visibility>
						</ei:ChangePropertyAction.Value>
					</ei:ChangePropertyAction>
				</i:EventTrigger>
			</i:Interaction.Triggers>
		</Button>

tut es aber.

16.02.2012 - 19:53 Uhr

hab deine erste Lösung noch mal ausgeführt; seltsam ist, dass:

 <Grid.InputBindings>
                                <MouseBinding Gesture="LeftDoubleClick" Command="{Binding DataContext.SetSelectedIndex, ElementName=dg}" />
                            </Grid.InputBindings>

nicht funktioniert, während

 <Grid.InputBindings>
                                <MouseBinding Gesture="LeftClick" Command="{Binding DataContext.SetSelectedIndex, ElementName=dg}" />
                            </Grid.InputBindings>

funktioniert.

16.02.2012 - 19:06 Uhr

InputBinding wird im Projekt nicht unterstützt, die Option das Projekt auf Net4 zu hieven bersteht für mich nicht.

Kannst du mir sagen warum


 <i:Interaction.Triggers>
                            <i:EventTrigger EventName="MouseDoubleClick">
                                <i:InvokeCommandAction Command="{Binding DataContext.SetSelectedIndex, ElementName=dg}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>

nicht funktioniert?

Danke.

16.02.2012 - 17:42 Uhr

Hallo,

ich habe einen Button mit einem Command

Command="{Binding DataContext.SetSelectedIndex, ElementName=dg}"

nun würde ich diesen Command gerne auslösen wenn es einen Doppelklick gibt, nicht auf den einfachen Klick. Wie kann man es lösen?

Vielen Dank.

02.02.2012 - 16:37 Uhr

hab es selbst gelöst, was mir fehlt war:


if (e.WidthChanged)
            {
...
}

Danke.

02.02.2012 - 15:25 Uhr

Vielleicht hab eich auch etwas nicht verstanden was dazu führt dass ich mich missverständlich ausdrücke was du dann nicht verstehst!?

Ich probiere es mal andersrum: wenn ich einem Control welches ich im Code generiere einen SizeChanged Event zuweise dan wird dieser immer ausgelöst sobald sich eben die Größe ändert (Breit und Höhe). Ich brauche nun aber eine Möglichkeit für einen Event der nur dann ausgelöst wird wenn sich die Breite ändert.

Kann ich das innerhalb des Events tun?

Was mir sicher auch heolfe würde wäre eine Option eine Variable auf Änderungen zu untersuchen um dann einen Event auszuösen, denn die ActualWidthProperty hab ich schon ...

02.02.2012 - 14:55 Uhr

Hi,

ich bräuchte eine Möglichkeit mit der ich bei Änderungen der aktuellen Breite eines Controls eine Methode aufrufen kann. die Option SizeChanged kann ich leider nicht dazu verwenden da sich die Höhe ständig verändert.

Wie kann ich so etwas machen? Vielen Dank für Eure Hilfe.

02.02.2012 - 14:15 Uhr

der scheint in der Tat überflüssig zu sein!?
Wie ist denn jenes Template von MS aufgebaut?

02.02.2012 - 13:58 Uhr

StandardTemplate von dem ich ausgegangen bin:


<BorderGapMaskConverter x:Key="BorderGapMaskConverter"/>
		<Style x:Key="GroupBoxStyle1" TargetType="{x:Type GroupBox}">
			<Setter Property="BorderBrush" Value="#D5DFE5"/>
			<Setter Property="BorderThickness" Value="1"/>
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="{x:Type GroupBox}">
						<Grid SnapsToDevicePixels="true">
							<VisualStateManager.VisualStateGroups>
								<VisualStateGroup x:Name="VisualStateGroup"/>
								<VisualStateGroup x:Name="VisualStateGroup1"/>
							</VisualStateManager.VisualStateGroups>
							<Grid.ColumnDefinitions>
								<ColumnDefinition Width="6"/>
								<ColumnDefinition Width="Auto"/>
								<ColumnDefinition Width="*"/>
								<ColumnDefinition Width="6"/>
							</Grid.ColumnDefinitions>
							<Grid.RowDefinitions>
								<RowDefinition Height="Auto"/>
								<RowDefinition Height="Auto"/>
								<RowDefinition Height="*"/>
								<RowDefinition Height="6"/>
							</Grid.RowDefinitions>
							<Border BorderBrush="Transparent" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="4" Grid.Column="0" CornerRadius="4" Grid.Row="1" Grid.RowSpan="3"/>
							<Border x:Name="Header" Grid.Column="1" Padding="3,1,3,0" Grid.Row="0" Grid.RowSpan="2">
								<ContentPresenter ContentSource="Header" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
							</Border>
							<ContentPresenter Grid.ColumnSpan="2" Grid.Column="1" Margin="{TemplateBinding Padding}" Grid.Row="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
							<Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" Grid.ColumnSpan="4" CornerRadius="4" Grid.Row="1" Grid.RowSpan="3">
								<Border.OpacityMask>
									<MultiBinding ConverterParameter="7" Converter="{StaticResource BorderGapMaskConverter}">
										<Binding ElementName="Header" Path="ActualWidth"/>
										<Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/>
										<Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/>
									</MultiBinding>
								</Border.OpacityMask>
								<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
									<Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/>
								</Border>
							</Border>
							
						</Grid>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
		</Style>

02.02.2012 - 12:54 Uhr

so etwas geht sehr gut über Trigger:

<Grid HorizontalAlignment="Left" Margin="-321,-33,0,31" Grid.RowSpan="3" Width="165" Background="#FFCACACA">
								<i:Interaction.Triggers>
									<i:EventTrigger EventName="MouseEnter">
										<ei:ChangePropertyAction TargetObject="{Binding ElementName=rectangle}" PropertyName="Fill">
											<ei:ChangePropertyAction.Value>
												<SolidColorBrush Color="Red"/>
											</ei:ChangePropertyAction.Value>
										</ei:ChangePropertyAction>
									</i:EventTrigger>
								</i:Interaction.Triggers>
								<Rectangle x:Name="rectangle" Fill="#FFF4F4F5" HorizontalAlignment="Right" Height="25" Stroke="Black" VerticalAlignment="Top" Width="42"/>
							</Grid>

musst zur Verwendung aber folgendes einbinden:


xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

ÜberTemplates kannst du es natürlich auch machen, dann ist deine Basis (Template) ein Button in dem Grid und Rechteck sind.

02.02.2012 - 12:22 Uhr

Moin, was dir Kopfschmerzen bereitet ist folgender Teil des Templates:


<Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" Grid.ColumnSpan="4" CornerRadius="4" Grid.Row="1" Grid.RowSpan="3">
								<Border.OpacityMask>
									<MultiBinding ConverterParameter="7" Converter="{StaticResource BorderGapMaskConverter}">
										<Binding ElementName="Header" Path="ActualWidth"/>
										<Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/>
										<Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/>
									</MultiBinding>
								</Border.OpacityMask>
								<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
									<Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/>
								</Border>
							</Border>

Dieser Teil kommt im Template nach dem ContentPresenter, ist also im Stapel übergeordnet.
Wenn du den veränderst, dann klappt das auch.

Viele Grüße.