Problem mit Expander

  • WPF

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Problem mit Expander

    Hallo liebe Community,
    ich habe momentan ein Problem mit einem Expander, welcher die Form vergrößern und verkleinern können und sich dabei drehen können soll. Der Code ist momentan folgender:
    Spoiler anzeigen

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. Height="200" Width="300" Background="#FFF0F5FA" ResizeMode="CanMinimize" SizeToContent="Width">
    5. <Grid>
    6. <Grid.RowDefinitions>
    7. <RowDefinition Height="90"/>
    8. <RowDefinition Height="85"/>
    9. </Grid.RowDefinitions>
    10. <Canvas Name="GraphCanvas" Background="White" Width="300">
    11. <Path Name="Expander" Data="M200,50 L220,100 125,140 125,240 70,240 70,100 70,100 70,100 z M130,0 L150,50 55,85 55,190 0,190 0,50 0,50 0,50 z"
    12. Height="31" Width="28" Fill="Black" Stretch="Fill" Opacity=".1" Canvas.Right="-27.5" Canvas.Top="40">
    13. <Path.RenderTransform>
    14. <TransformGroup>
    15. <ScaleTransform ScaleY="1" ScaleX="-1"/>
    16. <SkewTransform AngleY="0" AngleX="0"/>
    17. <RotateTransform Angle="35"/>
    18. <TranslateTransform/>
    19. </TransformGroup>
    20. </Path.RenderTransform>
    21. <Path.Triggers>
    22. <EventTrigger RoutedEvent="Path.MouseEnter">
    23. <BeginStoryboard>
    24. <Storyboard>
    25. <DoubleAnimation
    26. Storyboard.TargetName="Expander"
    27. Storyboard.TargetProperty="Opacity"
    28. To=".5" Duration="0:0:0.2"/>
    29. </Storyboard>
    30. </BeginStoryboard>
    31. </EventTrigger>
    32. <EventTrigger RoutedEvent="Path.MouseLeave">
    33. <BeginStoryboard>
    34. <Storyboard>
    35. <DoubleAnimation
    36. Storyboard.TargetName="Expander"
    37. Storyboard.TargetProperty="Opacity"
    38. To=".1" Duration="0:0:0.2"/>
    39. </Storyboard>
    40. </BeginStoryboard>
    41. </EventTrigger>
    42. <EventTrigger RoutedEvent="Path.MouseDown">
    43. <BeginStoryboard>
    44. <Storyboard>
    45. <DoubleAnimation
    46. Storyboard.TargetName="GraphCanvas"
    47. Storyboard.TargetProperty="Width"
    48. From="300" To="450" AccelerationRatio="1" Duration="0:0:0.25"/>
    49. <DoubleAnimation
    50. Storyboard.TargetName="Expander"
    51. Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)"
    52. From="1" To="-1" AccelerationRatio="1" Duration="0:0:0.25"/>
    53. <DoubleAnimation
    54. Storyboard.TargetName="Expander"
    55. Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleX)"
    56. From="-1" To="1" AccelerationRatio="1" Duration="0:0:0.25"/>
    57. <DoubleAnimation
    58. Storyboard.TargetName="Expander"
    59. Storyboard.TargetProperty="(RenderTransform).(TranslateTransform.X)"
    60. From="0" To="-40" AccelerationRatio="1" Duration="0:0:0.25"/>
    61. </Storyboard>
    62. </BeginStoryboard>
    63. </EventTrigger>
    64. </Path.Triggers>
    65. </Path>
    66. </Canvas>
    67. </Grid>
    68. </Window>

    Nun zu den eigentlichen Problemen:
    1.: Der Expander sollte sich eigentlich nach links umkehren, wenn er "expanded" wird, das tut er allerdings nicht. Er bleibt, wie er ist.
    2.: Ich weiß nicht, wie ich das implementieren kann, dass er sich bei nochmaligem Klicken wieder einzieht.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „nafets3646“ ()

    ich hab damit rumprobiert, und fund, dass man der ScaleTransform einen Namen verpassen kann, und dann die .ScaleX-Property animieren:

    XML-Quellcode

    1. <Window x:Class="MainWindow2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    2. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    3. Height="200" Width="300" Background="#FFF0F5FA" ResizeMode="CanMinimize" SizeToContent="Width">
    4. <Grid>
    5. <Grid.RowDefinitions>
    6. <RowDefinition Height="90"/>
    7. <RowDefinition Height="85"/>
    8. </Grid.RowDefinitions>
    9. <Canvas Name="GraphCanvas" Background="White" Width="250">
    10. <Path Name="Expander" Data="M200,50 L220,100 125,140 125,240 70,240 70,100 70,100 70,100 z M130,0 L150,50 55,85 55,190 0,190 0,50 0,50 0,50 z"
    11. Height="31" Width="28" Fill="Black" Stretch="Fill" Opacity=".1" Canvas.Right="5" Canvas.Top="40" RenderTransformOrigin="0.5,0.5">
    12. <Path.RenderTransform>
    13. <TransformGroup>
    14. <ScaleTransform x:Name="ExpanderScale" />
    15. <!--<SkewTransform AngleY="0" AngleX="0"/>-->
    16. <!--<RotateTransform Angle="35"/>-->
    17. <TranslateTransform/>
    18. </TransformGroup>
    19. </Path.RenderTransform>
    20. <Path.Triggers>
    21. <EventTrigger RoutedEvent="Path.MouseDown">
    22. <BeginStoryboard>
    23. <Storyboard>
    24. <DoubleAnimation
    25. Storyboard.TargetName="GraphCanvas"
    26. Storyboard.TargetProperty="Width"
    27. To="450" AccelerationRatio="1" Duration="0:0:0.25"/>
    28. <DoubleAnimation
    29. Storyboard.TargetName="ExpanderScale"
    30. Storyboard.TargetProperty="ScaleX"
    31. From="1" To="-1" AccelerationRatio="1" Duration="0:0:0.25"/>
    32. </Storyboard>
    33. </BeginStoryboard>
    34. </EventTrigger>
    35. </Path.Triggers>
    36. </Path>
    37. </Canvas>
    38. </Grid>
    39. </Window>
    zum hin und her müssteman den Button halt als ToggleButton auffassen - der hat entsprechende Events, wo man ein Storyboard reinmachen kann.
    Also der Expander-Togglebutton bekäme dann ein ControlTemplate mit diesem Path-Dingens.
    Das mit dem ToggleButton hab ich jetzt hinbekommen, allerdings mach ich bei dem ControlTemplate wohl irgendwas falsch - es verändert sich am ToggleButton direkt gar nichts, dafür wird eine Exception geschmissen.
    Spoiler anzeigen

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. Title="MainWindow" Height="200" Background="#FFF0F5FA" ResizeMode="CanMinimize" SizeToContent="Width">
    5. <Grid>
    6. <Grid.RowDefinitions>
    7. <RowDefinition Height="90"/>
    8. <RowDefinition Height="85"/>
    9. </Grid.RowDefinitions>
    10. <Canvas Name="GraphCanvas" Background="White" Width="300">
    11. <Canvas.BitmapEffect>
    12. <DropShadowBitmapEffect x:Name="Shadow" Color="Black" ShadowDepth=".2" Opacity=".33" Softness="1"/>
    13. </Canvas.BitmapEffect>
    14. <Canvas.Triggers>
    15. <EventTrigger RoutedEvent="Canvas.Loaded">
    16. <BeginStoryboard>
    17. <Storyboard>
    18. <DoubleAnimation
    19. Storyboard.TargetName="Shadow"
    20. Storyboard.TargetProperty="Opacity"
    21. From="0" To=".33" Duration="0:0:1"/>
    22. </Storyboard>
    23. </BeginStoryboard>
    24. </EventTrigger>
    25. </Canvas.Triggers>
    26. <ToggleButton Name="FormExpander" Style="{StaticResource ExpanderButton}" Height="31" Width="28" Opacity=".1" Canvas.Right="-27.5" Canvas.Top="40">
    27. <ToggleButton.RenderTransform>
    28. <TransformGroup>
    29. <ScaleTransform x:Name="FormExpanderScale" ScaleY="1" ScaleX="-1"/>
    30. <SkewTransform x:Name="FormExpanderSkew" AngleY="0" AngleX="0"/>
    31. <RotateTransform x:Name="FormExpanderRotation" Angle="35"/>
    32. <TranslateTransform x:Name="FormExpanderTranslation" X="0"/>
    33. </TransformGroup>
    34. </ToggleButton.RenderTransform>
    35. <ToggleButton.Resources>
    36. <Style x:Name="ExpanderButton" TargetType="{x:Type ToggleButton}">
    37. <Setter Property="Template">
    38. <Setter.Value>
    39. <ControlTemplate TargetType="{x:Type ToggleButton}">
    40. <Border Background="Transparent">
    41. <Path Data="M200,50 L220,100 125,140 125,240 70,240 70,100 70,100 70,100 z M130,0 L150,50 55,85 55,190 0,190 0,50 0,50 0,50 z"
    42. Fill="Black" Stretch="Fill"/>
    43. </Border>
    44. </ControlTemplate>
    45. </Setter.Value>
    46. </Setter>
    47. </Style>
    48. </ToggleButton.Resources>
    49. <ToggleButton.Triggers>
    50. <EventTrigger RoutedEvent="ToggleButton.MouseEnter">
    51. <BeginStoryboard>
    52. <Storyboard>
    53. <DoubleAnimation
    54. Storyboard.TargetName="FormExpander"
    55. Storyboard.TargetProperty="Opacity"
    56. To=".5" Duration="0:0:0.2"/>
    57. </Storyboard>
    58. </BeginStoryboard>
    59. </EventTrigger>
    60. <EventTrigger RoutedEvent="ToggleButton.MouseLeave">
    61. <BeginStoryboard>
    62. <Storyboard>
    63. <DoubleAnimation
    64. Storyboard.TargetName="FormExpander"
    65. Storyboard.TargetProperty="Opacity"
    66. To=".1" Duration="0:0:0.2"/>
    67. </Storyboard>
    68. </BeginStoryboard>
    69. </EventTrigger>
    70. <EventTrigger RoutedEvent="ToggleButton.Checked">
    71. <BeginStoryboard>
    72. <Storyboard>
    73. <DoubleAnimation
    74. Storyboard.TargetName="GraphCanvas"
    75. Storyboard.TargetProperty="Width"
    76. From="300" To="530" AccelerationRatio="1" Duration="0:0:0.25"/>
    77. <DoubleAnimation
    78. Storyboard.TargetName="FormExpanderScale"
    79. Storyboard.TargetProperty="ScaleY"
    80. From="1" To="-1" AccelerationRatio="1" Duration="0:0:0.25"/>
    81. <DoubleAnimation
    82. Storyboard.TargetName="FormExpanderScale"
    83. Storyboard.TargetProperty="ScaleX"
    84. From="-1" To="1" AccelerationRatio="1" Duration="0:0:0.25"/>
    85. <DoubleAnimation
    86. Storyboard.TargetName="FormExpanderTranslation"
    87. Storyboard.TargetProperty="X"
    88. From="0" To="-40" AccelerationRatio="1" Duration="0:0:0.25"/>
    89. <DoubleAnimation
    90. Storyboard.TargetName="FormExpanderTranslation"
    91. Storyboard.TargetProperty="Y"
    92. From="0" To="10" AccelerationRatio="1" Duration="0:0:0.25"/>
    93. </Storyboard>
    94. </BeginStoryboard>
    95. </EventTrigger>
    96. <EventTrigger RoutedEvent="ToggleButton.Unchecked">
    97. <BeginStoryboard>
    98. <Storyboard>
    99. <DoubleAnimation
    100. Storyboard.TargetName="GraphCanvas"
    101. Storyboard.TargetProperty="Width"
    102. From="530" To="300" AccelerationRatio="1" Duration="0:0:0.25"/>
    103. <DoubleAnimation
    104. Storyboard.TargetName="FormExpanderScale"
    105. Storyboard.TargetProperty="ScaleY"
    106. From="-1" To="1" AccelerationRatio="1" Duration="0:0:0.25"/>
    107. <DoubleAnimation
    108. Storyboard.TargetName="FormExpanderScale"
    109. Storyboard.TargetProperty="ScaleX"
    110. From="1" To="-1" AccelerationRatio="1" Duration="0:0:0.25"/>
    111. <DoubleAnimation
    112. Storyboard.TargetName="FormExpanderTranslation"
    113. Storyboard.TargetProperty="X"
    114. From="-40" To="0" AccelerationRatio="1" Duration="0:0:0.25"/>
    115. <DoubleAnimation
    116. Storyboard.TargetName="FormExpanderTranslation"
    117. Storyboard.TargetProperty="Y"
    118. From="10" To="0" AccelerationRatio="1" Duration="0:0:0.25"/>
    119. </Storyboard>
    120. </BeginStoryboard>
    121. </EventTrigger>
    122. </ToggleButton.Triggers>
    123. </ToggleButton>
    124. </Canvas>
    125. </Grid>
    126. </Window>


    //EDIT: Jetzt wirfts im Designer keine Fehler mehr, dafür aber beim Starten:
    Zeilennummer "31" und Zeilenposition "27" von "Die Angabe eines Werts für "System.Windows.StaticResourceExtension" führte zu einer Ausnahme.".


    //EDIT2: Jetzt kommt wieder ein Fehler (hab nichts verändert ?():

    Quellcode

    1. Fehler 1 Die Ressource "ExpanderButton" konnte nicht aufgelöst werden. C:\Users\****\MainWindow.xaml 31 47

    Aber immerhin ist im Designer schonmal das Aussehen richtig.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „nafets3646“ ()

    k.A., so habichdas noch nicht probiert: Im übergeordneten Visual verweist du auf eine StaticResource, die im Visual selbst drinne ist - glaub fast, das geht nicht.

    Jedenfalls nicht sinnvoll. Wenn der ToggleButton diesen Style haben soll, dann tu ihn doch in seine Style-Property, nicht in seine Resourcen.

    Warum bist du ühaupt jetzt mit einem Style unterwegs - was du brauchst ist doch ein Template?

    Das habich jetzt schon ganz oft gesehen, dass jmd, um ein ControlTemplate anzuwenden, einen Style schreibt, wo das Template drin ist, und dann den Style aufs ZielControl anwendet.
    Anstatt das ControlTemplate gleich aufs ZielControl anzuwenden.

    Wo schreibt man solch "von-hinten-durch-die-brust-ins-Auge" immer nur ab? - frag ich mich.
    In diesem Fall von Stackoverflow, wie mache ich es denn richtig?

    //EDIT: Hab nen Weg gefunden, es zum Laufen zu bringen, ist das so richtig?:
    Spoiler anzeigen

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. Title="MainWindow" Height="200" Background="#FFF0F5FA" ResizeMode="CanMinimize" SizeToContent="Width">
    5. <Window.Resources>
    6. <ControlTemplate x:Name="ExpanderButton" x:Key="ExpanderButton" TargetType="{x:Type ToggleButton}">
    7. <Border Background="Transparent">
    8. <Path Data="M200,50 L220,100 125,140 125,240 70,240 70,100 70,100 70,100 z M130,0 L150,50 55,85 55,190 0,190 0,50 0,50 0,50 z"
    9. Fill="Black" Stretch="Fill"/>
    10. </Border>
    11. </ControlTemplate>
    12. </Window.Resources>
    13. <Grid>
    14. <Grid.RowDefinitions>
    15. <RowDefinition Height="90"/>
    16. <RowDefinition Height="85"/>
    17. </Grid.RowDefinitions>
    18. <Canvas Name="GraphCanvas" Background="White" Width="300">
    19. <Canvas.BitmapEffect>
    20. <DropShadowBitmapEffect x:Name="Shadow" Color="Black" ShadowDepth=".2" Opacity=".33" Softness="1"/>
    21. </Canvas.BitmapEffect>
    22. <Canvas.Triggers>
    23. <EventTrigger RoutedEvent="Canvas.Loaded">
    24. <BeginStoryboard>
    25. <Storyboard>
    26. <DoubleAnimation
    27. Storyboard.TargetName="Shadow"
    28. Storyboard.TargetProperty="Opacity"
    29. From="0" To=".33" Duration="0:0:1"/>
    30. </Storyboard>
    31. </BeginStoryboard>
    32. </EventTrigger>
    33. </Canvas.Triggers>
    34. <ToggleButton Name="FormExpander" Template="{StaticResource ExpanderButton}" Height="31" Width="28" Opacity=".1" Canvas.Right="-27.5" Canvas.Top="40">
    35. <ToggleButton.RenderTransform>
    36. <TransformGroup>
    37. <ScaleTransform x:Name="FormExpanderScale" ScaleY="1" ScaleX="-1"/>
    38. <SkewTransform x:Name="FormExpanderSkew" AngleY="0" AngleX="0"/>
    39. <RotateTransform x:Name="FormExpanderRotation" Angle="35"/>
    40. <TranslateTransform x:Name="FormExpanderTranslation" X="0"/>
    41. </TransformGroup>
    42. </ToggleButton.RenderTransform>
    43. <ToggleButton.Triggers>
    44. <EventTrigger RoutedEvent="ToggleButton.MouseEnter">
    45. <BeginStoryboard>
    46. <Storyboard>
    47. <DoubleAnimation
    48. Storyboard.TargetName="FormExpander"
    49. Storyboard.TargetProperty="Opacity"
    50. To=".5" Duration="0:0:0.2"/>
    51. </Storyboard>
    52. </BeginStoryboard>
    53. </EventTrigger>
    54. <EventTrigger RoutedEvent="ToggleButton.MouseLeave">
    55. <BeginStoryboard>
    56. <Storyboard>
    57. <DoubleAnimation
    58. Storyboard.TargetName="FormExpander"
    59. Storyboard.TargetProperty="Opacity"
    60. To=".1" Duration="0:0:0.2"/>
    61. </Storyboard>
    62. </BeginStoryboard>
    63. </EventTrigger>
    64. <EventTrigger RoutedEvent="ToggleButton.Checked">
    65. <BeginStoryboard>
    66. <Storyboard>
    67. <DoubleAnimation
    68. Storyboard.TargetName="GraphCanvas"
    69. Storyboard.TargetProperty="Width"
    70. From="300" To="530" AccelerationRatio="1" Duration="0:0:0.25"/>
    71. <DoubleAnimation
    72. Storyboard.TargetName="FormExpanderScale"
    73. Storyboard.TargetProperty="ScaleY"
    74. From="1" To="-1" AccelerationRatio="1" Duration="0:0:0.25"/>
    75. <DoubleAnimation
    76. Storyboard.TargetName="FormExpanderScale"
    77. Storyboard.TargetProperty="ScaleX"
    78. From="-1" To="1" AccelerationRatio="1" Duration="0:0:0.25"/>
    79. <DoubleAnimation
    80. Storyboard.TargetName="FormExpanderTranslation"
    81. Storyboard.TargetProperty="X"
    82. From="0" To="-40" AccelerationRatio="1" Duration="0:0:0.25"/>
    83. <DoubleAnimation
    84. Storyboard.TargetName="FormExpanderTranslation"
    85. Storyboard.TargetProperty="Y"
    86. From="0" To="10" AccelerationRatio="1" Duration="0:0:0.25"/>
    87. </Storyboard>
    88. </BeginStoryboard>
    89. </EventTrigger>
    90. <EventTrigger RoutedEvent="ToggleButton.Unchecked">
    91. <BeginStoryboard>
    92. <Storyboard>
    93. <DoubleAnimation
    94. Storyboard.TargetName="GraphCanvas"
    95. Storyboard.TargetProperty="Width"
    96. From="530" To="300" AccelerationRatio="1" Duration="0:0:0.25"/>
    97. <DoubleAnimation
    98. Storyboard.TargetName="FormExpanderScale"
    99. Storyboard.TargetProperty="ScaleY"
    100. From="-1" To="1" AccelerationRatio="1" Duration="0:0:0.25"/>
    101. <DoubleAnimation
    102. Storyboard.TargetName="FormExpanderScale"
    103. Storyboard.TargetProperty="ScaleX"
    104. From="1" To="-1" AccelerationRatio="1" Duration="0:0:0.25"/>
    105. <DoubleAnimation
    106. Storyboard.TargetName="FormExpanderTranslation"
    107. Storyboard.TargetProperty="X"
    108. From="-40" To="0" AccelerationRatio="1" Duration="0:0:0.25"/>
    109. <DoubleAnimation
    110. Storyboard.TargetName="FormExpanderTranslation"
    111. Storyboard.TargetProperty="Y"
    112. From="10" To="0" AccelerationRatio="1" Duration="0:0:0.25"/>
    113. </Storyboard>
    114. </BeginStoryboard>
    115. </EventTrigger>
    116. </ToggleButton.Triggers>
    117. </ToggleButton>
    118. </Canvas>
    119. </Grid>
    120. </Window>
    ah- StackOverflow - c#ler!
    (Ich stichel ja gerne gegen c#ler, weil die immer alles so umständlich machen.)


    Ansonsten sieht doch gut aus.

    Ich hab hier auch ein, wo das Template gleich mit drinne ist:

    XML-Quellcode

    1. <ToggleButton Width="60" HorizontalAlignment="Left" >
    2. <Control.Template>
    3. <ControlTemplate>
    4. <Grid Background="#00000000">
    5. <Path Margin="5" Stretch="Fill" Data="M0,0L4,8 0,16 M4,0L8,8 4,16" StrokeThickness="12" Stroke="Black" />
    6. </Grid>
    7. </ControlTemplate>
    8. </Control.Template>
    9. </ToggleButton>
    wobei mir eine Border eiglich besser gefällt als wie bei mir, mittm Grid als LayoutRoot des Templates.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()