Biggle's Blog

Web- und Software Development

by Mario Priebe

Toggle – WindowState Maximize / Normal

Wenn man in seiner WPF Applikation eigene Application-Icons zum minimieren, maximieren, schließen, usw. einsetzt, muss man erstens das Verhalten und zweitens das Aussehen selbst implementieren.

In diesem Snippet möchte ich zeigen, wie man zwischen den angezeigten Grafiken wechselt, wenn der entsprechende Zustand eintrifft.

Ist die Applikation im maximierten Zustand soll das Icon für “minimieren” angezeigt werden und wenn der Zustand der Applikation im normalen Zustand ist, anders herum.

Dies geht recht einfach mit einem Style und einem DataTrigger:

    <Style TargetType="Image" x:Key="ToggleIcon">
        <Setter Property="Source" Value="{DynamicResource MaximizeIcon}" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding WindowState, ElementName=TheNameOfMyWindow}" Value="Maximized">
                <Setter Property="Source" Value="{DynamicResource NormalIcon}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

Die DynamicResources in dem Beispiel sind gebunden an eine ImageSource:

    <ImageSource x:Key="MaximizeIcon">/MyApp.UI.Resources;component/Images/icon_maximize.png</ImageSource>
    <ImageSource x:Key="NormalIcon">/MyApp.UI.Resources;component/Images/icon_normal.png</ImageSource>

Die Verwendung ist dann nur noch Formsache…

<Image Stretch="None" Style="{DynamicResource ToggleIcon}" HorizontalAlignment="Right" VerticalAlignment="Top" Cursor="Hand" 
ToolTip="{x:Static Resources:Resources.maximize}" MouseLeftButtonDown="ToggleMaxNormal" />
private void ToggleMaxNormal(object sender, MouseButtonEventArgs e)
{
    switch (WindowState)
    {
        case WindowState.Normal:
            WindowState = WindowState.Maximized;
            break;
        case WindowState.Maximized:
            WindowState = WindowState.Normal;
            break;
    }
}

Viel Spaß beim entwickeln : )

by Mario Priebe

DelegateCommand – Visual Studio Snippet

Folgendes Snippet erstellt bei der Eingabe von vmc <tab> ein MVVM Command (DelegateCommand).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#region Command: MyBtnClickCommand
private DelegateCommand _MyBtnClickCommand;
 
public ICommand MyBtnClickCommand
{
    get
    {
        if (_MyBtnClickCommand == null)
        {
            _MyBtnClickCommand = new DelegateCommand(MyBtnClick, CanMyBtnClick);
        }
        return _MyBtnClickCommand;
    }
}
 
private void MyBtnClick()
{
    //method here
}
 
private bool CanMyBtnClick()
{
    //canExecuteMethod here
    return true;
}
#endregion

Kopiert wird das Snippet (Windows7) unter VS 2010 nach
%Userprofile%\Documents\Visual Studio 2010\Code Snippets\Visual C#\My Code Snippets\

unter VS 2008 nach:
%Userprofile%\Documents\Visual Studio 2008\Code Snippets\Visual C#\My Code Snippets\

und unter VS 2005 nach: 
%Userprofile%\Documents\Visual Studio 2005\Code Snippets\Visual C#\My Code Snippets\

Download snippet (.txt Erweiterung muss entfernt werden)


Implementiert werden muss dann nur noch die Execute und CanExecute Methode.

Und im Xaml wird das ganze dann an der Property Command gebunden

<Button Command="{Binding MyBtnClickCommand}" ...

Viel Spass damit.

by Mario Priebe

ViewModelProperty – Visual Studio Snippet

Folgendes Snippet erstellt bei der Eingabe von vmprop ein ViewModelProperty

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#region ViewModelProperty ViewModelPropertyName
private string _privatePropertyName;
public string ViewModelPropertyName
{
    get
    {
        return _privatePropertyName;
    }
    set
    {
        _privatePropertyName = value;
        RaisePropertyChanged(m => m.ViewModelPropertyName);
    }
}
#endregion

Kopiert wird das Snippet (Windows7)

unter VS 2010 nach
%Userprofile%\Documents\Visual Studio 2010\Code Snippets\Visual C#\My Code Snippets

unter VS 2008 nach:
%Userprofile%\Documents\Visual Studio 2008\Code Snippets\Visual C#\My Code Snippets\

und unter VS 2005 nach
%Userprofile%\Documents\Visual Studio 2005\Code Snippets\Visual C#\My Code Snippets\

Download snippet (.txt Erweiterung muss entfernt werden)

RaisePropertyChanged Methode muss in einer ViewModelBase-Klasse implementiert werden (by jp.hamilton), welche von der entsprechenden ViewModel-Klasse geerbt wird:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ViewModelBase<T> : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged<R>(Expression<Func<T, R>> x)
    {
        var body = x.Body as MemberExpression;
        if (body == null)
            throw new ArgumentException("'x' should be a member expression");
 
        string propertyName = body.Member.Name;
 
        PropertyChangedEventHandler handler = this.PropertyChanged;
 
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

Viel Spaß damit

by Mario Priebe

Liste von doppelten Einträgen befreien

So kann es gehen, ich hab mir eine Methode geschrieben, die doppelte Items aus einer Liste entfernen soll. Funktioniert soweit auch gut.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public List<T> RemoveDoubleListItems<T>(List<T> list)
{
    var newList = new List<T>();
    var keys = new Dictionary<T, object>();
 
    foreach (T listItem in list)
    {
        if (!keys.ContainsKey(listItem))
        {
            newList.Add(listItem);
            keys.Add(listItem, null);
        }
    }
    return newList;
}

In der Datenbank wo ich meine Snippets speichere (codekeep), habe ich kurze Zeit später einen Blick drauf geworfen und dachte, ich trau meinen Augen nicht. Die selbe Funktion noch einmal, von jemand anderes geschrieben. Ich klick mich da rein und musste dann feststellen, das ich mit meinem Ansatz ganz schön “blöd” da gestanden haben muss, denn hier präsentierte sich ein “Einzeiler” der nicht besser sein kann, wie ich finde.

Der Udo Nesshoever verwendet dafür das Hashset und lässt dieses die Arbeit machen.

1
2
3
4
public static List<T> RemoveDuplicates<T>(List<T> list)
{
    return list != null ? new HashSet<T>(list).ToList() : null;
}

Ich kenne zwar das Hashset, habe aber noch nichts damit gemacht. Von daher wusste ich natürlich auch nicht, wenn man dem eine IEnumerable gibt, entfernt diese automatisch alle doppelten Items aus der Collection. Steht so auch leider nicht in der MSDN. Dort steht lediglich: “Eine Menge ist eine Auflistung ohne doppelte Elemente”. Naja aus Erfahrung lernt man. Stimmt.

Interessant finde ich auch “Einfach ausgedrückt, kann die HashSet-Klasse als Dictionary-Auflistung ohne Werte betrachtet werden.”

Schade das man auf codekeep kein Rating bzw. keine Kommentar abgeben kann, so könnte man durchaus auf solche Ansätze aufmerksam gemacht werden.

Vielen Dank für den Tipp Udo : )


by Mario Priebe

DependencyProperty – Visual Studio Snippet

Folgendes Snippet erstellt bei der Eingabe von dpprop <tab> ein DependencyProperty

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#region DependencyProperty: propertyName
public propertyType propertyName
    {
        get
        {
            return (propertyType)GetValue(propertyNameProperty);
        }
        set
        {
            SetValue(propertyNameProperty, value);
        }
    }
 
    public static readonly DependencyProperty propertyNameProperty =
        DependencyProperty.Register("propertyName", typeof(propertyType), typeof(ownerType),
        new FrameworkPropertyMetadata());
#endregion

Kopiert wird das Snippet unter VS 2008 nach:

%Userprofile%\Eigene Dateien\Visual Studio 2008\Code Snippets\Visual C#\My Code Snippets\

oder unter VS 2005 nach

%Userprofile%\Eigene Dateien\Visual Studio 2005\Code Snippets\Visual C#\My Code Snippets\

Download snippet (.txt Erweiterung muss entfernt werden)

Viel Spaß damit

by Mario Priebe

New public Class – Visual Studio Snippet

Folgendes Snippet erstellt bei der Eingabe von pc <tab> eine neue public Klasse mit einem leeren Konstruktor, ein leeres Property und einen Methodenrumpf.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/// <summary>
///
/// </summary>
 
public class MyClass
{
    #region constructors
    public MyClass()
    {
    }
    #endregion

    #region properties
    public TYPE Type { get; set; }
    #endregion

    #region methods
    /// <summary>
    ///
    /// </summary>
 
    public void Methode()
    {
    }
    #endregion
}

Kopiert wird das Snippet unter VS 2008 nach:

%Userprofile%\Eigene Dateien\Visual Studio 2008\Code Snippets\Visual C#\My Code Snippets\

oder unter VS 2005 nach

%Userprofile%\Eigene Dateien\Visual Studio 2005\Code Snippets\Visual C#\My Code Snippets\

Download snippet (.txt Erweiterung muss entfernt werden)

Viel Spaß damit