June 29th, 2010
If you want to implement your own Undo/Redo and prevent e.g. a TextBox from intercepting, attach to the command preview events through CommandManager.AddPreviewCanExecuteHandler and CommandManager.AddPreviewExecutedHandler and set the event.Handled flag to true:
MySomething()
{
CommandManager.AddPreviewCanExecuteHandler(
this,
new CanExecuteRoutedEventHandler(OnPreviewCanExecuteHandler));
CommandManager.AddPreviewExecutedHandler(
this,
new ExecutedRoutedEventHandler(OnPreviewExecutedEvent));
}
void OnPreviewCanExecuteHandler(object sender, CanExecuteRoutedEventArgs e)
{
if (e.Command == ApplicationCommands.Undo)
{
e.CanExecute = true;
e.Handled = true;
}
else if (e.Command == ApplicationCommands.Redo)
{
e.CanExecute = true;
e.Handled = true;
}
}
void OnPreviewExecutedEvent(object sender, ExecutedRoutedEventArgs e)
{
if (e.Command == ApplicationCommands.Undo)
{
// DO YOUR UNDO HERE
e.Handled = true;
}
else if (e.Command == ApplicationCommands.Redo)
{
// DO YOUR REDO HERE
e.Handled = true;
}
}
Posted in Uncategorized | No Comments »
May 8th, 2010
Based on Codekeep by Stephen Smith. Additionally I escape backslash:
public static string WildcardToRegex(string pattern)
{
return ("^" +
pattern.Replace(@"\", @"\\")
.Replace(".", @"\.")
.Replace("*", "(.*)")
.Replace("?", "(.{1,1})"));
}
}
Here some testcode:
string[] texts = new string[]
{
@"\\VirtualDrive\Test1.mp3",
@"\\VirtualDrive\Test2.mp3",
@"\\VirtualDrive\Test3.bin"
};
string wildCards = @"\\VirtualDrive\*.mp3";
string pattern = WildcardToRegex(wildCards);
string[] result =
(from t in texts
where RegularExpressions.Regex.IsMatch(t, pattern, RegexOptions.IgnoreCase)
select t).ToArray();
UnitTest.Test(result.Length == 2);
UnitTest.Test(result[0] == texts[0]);
UnitTest.Test(result[1] == texts[1]);
Posted in Uncategorized | No Comments »
March 12th, 2010
I am far away knowing how things work in WPF. For writing an own list view I needed quite much time. If it is done right? I can’t tell. Here how I understood things: Demo Project for Visual Studio 2008.
The goals were:
- Data is provided through data binding
- Support for different type of objects, each getting its own view
- Overwrite the default look with the blue selection background
A data bound WPF ListView in XAML with overwritten look using templates and template triggers:
<ListView Name="myListView" ItemsSource="{Binding MyList}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="Border" Padding="2"
SnapsToDevicePixels="true"
Background="Transparent">
<ContentPresenter Name="Content" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border"
Property="Background" Value="Tomato"/>
<Setter Property="Foreground" Value="Yellow"/>
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="Gray"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.Resources>
<DataTemplate DataType="{x:Type local:MyItemBase}">
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type local:MyItemDerived}">
<StackPanel>
<TextBlock Text="{Binding Path=Name}"></TextBlock>
<TextBlock Text="{Binding Path=Description}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.Resources>
</ListView>
Here the document classes in c#. MyDocument contains the list. MyItemBase and MyItemDerived are the classes of items contained in the list. For both item classes a data template was defined in the XAML file:
public class MyItemBase
{
private string name;
public MyItemBase(string name)
{ Name = name; }
public string Name
{
get { return name; }
set { name = value; }
}
}
public class MyItemDerived : MyItemBase
{
private string description;
public MyItemDerived(string name, string description)
: base(name)
{ Description = description; }
public string Description
{
get { return description; }
set { description = value; }
}
}
public class MyItemList
{
private ObservableCollection<MyItemBase> myList
= new ObservableCollection<MyItemBase>();
public MyItemList()
{
myList.Add(new MyItemBase("Banana"));
myList.Add(new MyItemBase("Apple"));
myList.Add(new MyItemDerived("Orange", "Also a color"));
myList.Add(new MyItemBase("Mango"));
}
public ObservableCollection<MyItemBase> MyList
{
get { return myList; }
}
}
Here the view gets connected with the document:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
myListView.DataContext = new MyItemList();
}
}
And here is how it looks in action (quite bad, eh?):

References:
MDSN: ListView
MSDN: ListViewItem
MSDN: How to ListView
Codeproject: WPF custom ListBox with scrollbar on the background
SwitchOnTheCode: ListView tutorial with editable GridView
Blog: About ScrollViewer.CanContentScroll
Blog: Get rid of blue background 1
Blog: Get rid of blue background 2
Posted in C#, Nerd, Projects, WPF | No Comments »
February 10th, 2010
MSDN: New UAC Technologies for Windows Vista
MSDN: Registry Virtualization
You can verify the status of Virtualization in Task Manange / View / Select Columns / show the Virtualization column.
Posted in Uncategorized | No Comments »
January 18th, 2010
Posted in Nerd | No Comments »
December 17th, 2009
From PDC 09: Part 1, Part 2, each 1.30 hours.
Posted in Nerd | No Comments »
October 16th, 2009
Jim Springfield wrote a good starting point how to disable IntelliSense via VS macros: http://blogs.msdn.com/vcblog/…
Posted in Nerd | No Comments »