/Application/GUI/Controls/EditableTextBlock.xaml

http://yet-another-music-application.googlecode.com/ · XAML · 115 lines · 78 code · 11 blank · 26 comment · 0 complexity · ad201d31b990b97415ce5999e3d259d2 MD5 · raw file

  1. <!--EditableTextBlock.xaml
  2. A custom textblock that can be turned into a textbox for
  3. editing. This code was originally written by Jesper Borgstrup
  4. and can be found at
  5. http://www.codeproject.com/KB/WPF/editabletextblock.aspx
  6. = = = = = = = = = =
  7. This code is part of the Stoffi Music Player Project.
  8. Visit our website at: stoffiplayer.com
  9. This program is free software; you can redistribute it and/or
  10. modify it under the terms of the GNU General Public License
  11. as published by the Free Software Foundation; either version
  12. 3 of the License, or (at your option) any later version.
  13. See stoffiplayer.com/license for more information.
  14. -->
  15. <UserControl x:Class="Stoffi.EditableTextBlock"
  16. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  17. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  18. xmlns:local="clr-namespace:Stoffi"
  19. x:Name="mainControl">
  20. <UserControl.Resources>
  21. <DataTemplate x:Key="EditModeTemplate">
  22. <TextBox KeyUp="TextBox_KeyUp"
  23. Loaded="TextBox_Loaded"
  24. LostFocus="TextBox_LostFocus"
  25. x:Name="EditBox"
  26. Margin="0 0 0 0"
  27. BorderThickness="1"
  28. BorderBrush="Black"
  29. Padding="-1 -1 0 -1"/>
  30. <DataTemplate.Triggers>
  31. <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:EditableTextBlock}}, Path=SimpleHover}" Value="False">
  32. <Setter TargetName="EditBox" Property="Padding" Value="-1 -1 0 1"/>
  33. <Setter TargetName="EditBox" Property="Margin" Value="0 0 0 -2"/>
  34. </DataTrigger>
  35. </DataTemplate.Triggers>
  36. </DataTemplate>
  37. <DataTemplate x:Key="DisplayModeTemplate">
  38. <Border SnapsToDevicePixels="True" CornerRadius="1" VerticalAlignment="Top" Padding="0"
  39. Margin="0,0,0,0" Name="OuterBorder" BorderThickness="0,0,1,1" BorderBrush="Transparent">
  40. <Border SnapsToDevicePixels="True" CornerRadius="1" VerticalAlignment="Top" Padding="0"
  41. Margin="0 0 0 0" Name="InnerBorder" BorderThickness="1,1,0,0" BorderBrush="Transparent">
  42. <StackPanel>
  43. <TextBlock Text="{Binding ElementName=mainControl, Path=FormattedText}" Name="Block"
  44. Margin="0"
  45. Padding="2,0,0,0"
  46. MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"
  47. TextTrimming="CharacterEllipsis"
  48. ToolTip="{Binding ElementName=mainControl, Path=FormattedText}"/>
  49. </StackPanel>
  50. </Border>
  51. </Border>
  52. <DataTemplate.Triggers>
  53. <!-- simple hover -->
  54. <MultiDataTrigger>
  55. <MultiDataTrigger.Conditions>
  56. <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Border}}, Path=IsMouseOver}" Value="True"/>
  57. <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:EditableTextBlock}}, Path=ClickToEdit}" Value="True"/>
  58. <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:EditableTextBlock}}, Path=SimpleHover}" Value="True"/>
  59. </MultiDataTrigger.Conditions>
  60. <!-- border -->
  61. <Setter TargetName="OuterBorder" Property="BorderBrush" Value="Gray"/>
  62. <Setter TargetName="InnerBorder" Property="BorderBrush" Value="Gray"/>
  63. <!-- cursor -->
  64. <Setter Property="Cursor" Value="IBeam"/>
  65. </MultiDataTrigger>
  66. <!-- non-simple hover -->
  67. <MultiDataTrigger>
  68. <MultiDataTrigger.Conditions>
  69. <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Border}}, Path=IsMouseOver}" Value="True"/>
  70. <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:EditableTextBlock}}, Path=ClickToEdit}" Value="True"/>
  71. <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:EditableTextBlock}}, Path=SimpleHover}" Value="False"/>
  72. </MultiDataTrigger.Conditions>
  73. <!-- spacing -->
  74. <Setter TargetName="OuterBorder" Property="Margin" Value="-1,0,0,-2"/>
  75. <Setter TargetName="OuterBorder" Property="CornerRadius" Value="2"/>
  76. <Setter TargetName="InnerBorder" Property="CornerRadius" Value="2"/>
  77. <Setter TargetName="Block" Property="Padding" Value="3,0,0,2"/>
  78. <!-- border -->
  79. <Setter TargetName="OuterBorder" Property="BorderBrush" Value="PaleTurquoise"/>
  80. <Setter TargetName="InnerBorder" Property="BorderBrush" Value="SteelBlue"/>
  81. <Setter TargetName="InnerBorder" Property="Background" Value="White"/>
  82. <Setter TargetName="Block" Property="Foreground" Value="Black"/>
  83. <!-- cursor -->
  84. <Setter Property="Cursor" Value="IBeam"/>
  85. </MultiDataTrigger>
  86. </DataTemplate.Triggers>
  87. </DataTemplate>
  88. <Style TargetType="{x:Type local:EditableTextBlock}">
  89. <Style.Triggers>
  90. <Trigger Property="IsInEditMode" Value="True">
  91. <Setter Property="ContentTemplate" Value="{StaticResource EditModeTemplate}" />
  92. </Trigger>
  93. <Trigger Property="IsInEditMode" Value="False">
  94. <Setter Property="ContentTemplate" Value="{StaticResource DisplayModeTemplate}" />
  95. </Trigger>
  96. </Style.Triggers>
  97. </Style>
  98. </UserControl.Resources>
  99. </UserControl>