none
GridView -> Element im Header auf der rechten Seite platzieren. RRS feed

  • Frage

  • Ich möchte in meinem GridViewHeader ein Element rechtsbündig ausrichten, also an den rechten Rand

    der Gruppe stellen und habe etwa folgendes probiert.:

                                <GroupStyle.HeaderTemplate>
                                    <DataTemplate>
                                        <Grid>

                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition
                                                    Width="*"></ColumnDefinition>
                                                <ColumnDefinition
                                                    Width="*"></ColumnDefinition>
                                            </Grid.ColumnDefinitions>

                                            <Button
                                                Grid.Column="0"
                                                AutomationProperties.Name="Group Title"
                                                Style="{StaticResource TextPrimaryButtonStyle}" />


                                                <Button
                                                    Grid.Column="1"

                                                    HorizontalAlignment="Right"

                                                    Content="&#xE0A1;"></Button>
                                        </Grid>
                                    </DataTemplate>
                                </GroupStyle.HeaderTemplate>

    Unglücklicherweise bleibt alles auf der linken Seite beeinander und der Grid spannt sich nicht über die Gruppenbreite auf. 

    Wie kann ich dafür sorgen das das Element auch bei unterschiedlichen Auflösungen und

    unterschiedlicher Anzahl von GruppenItems am rechten Rand der Gruppe steht? 






    Donnerstag, 4. April 2013 09:47

Antworten

  • Width="*" geht nur bei ColumnsDefinition's. Allgmein scheint es kaum eine wirklich eifnache Lösung zu geben. Möglich ist es aber, auch wenn es in meinen Aufgen unnötig kompliziert ist, wie so vieles bei den Win8 Apps...

    Als erstes brauchst du einen Konverter:

        class WidthConverter : IValueConverter
        {
            #region IValueConverter Member
    
            public object Convert(object value, Type targetType, object parameter, string language)
            {
                int x;
                if (parameter != null)
                    x = int.Parse(parameter.ToString());
                else
                    x = 1;
                if ((int)value % x == 0)
                    return (int)value / x * 260 - 5;
                else
                    return ((int)value / x + 1) * 260 - 5;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, string language)
            {
                throw new NotImplementedException();
            }
    
            #endregion
        }

    XML-Resource:

            <local:WidthConverter x:Key="WidthConverter"/>

    und nun musst du die Breite des Grids binden:

     <Grid Width="{Binding Items.Count, Converter={StaticResource WidthConverter}, ConverterParameter=2}">

    uns jetzt kommt das nervige daran. Der Convertparameter 2 passt bei den meisten Bildschirmauflösungen. Aber bei einem 1080p Monitor wird das nichts mehr... Da baucht man dann 3 und bei ncoh höheren Auflösungen dann 4 usw...

    Liegt daran das es keine Multibindings gibt (warum bitte nicht!?). ConvertParameter kann man leider auch nicht binden. Ich glaube das das momentan die einzige Möglichkeit ist. Leider.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    • Als Antwort markiert KonstantinOtte Donnerstag, 11. April 2013 07:43
    Mittwoch, 10. April 2013 13:12

Alle Antworten

  • Hallo,

    du kannst hier auch auf Deutsch fragen.

    Zum Problem: Jedes Control hat die HorizontalAlignment-Eigenschaft. Wenn du diese auf Right festlgest, dann hängt das Control am rechten Rand. Ich würde übrigens die Spaltenbreite auf Auto setzen, so regeln sich die Größen von alleine.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Donnerstag, 4. April 2013 23:20
  • Hi!

    Danke für die schnelle Antwort.

    Was du vorgeschlagen hast habe ich bereits probiert. Leider ohne Erfolg alles klebt links trotz HorizontalAlignment="Right"

    Auch die Spaltenbreite auf Auto macht keinen Unterschied. 

    Freitag, 5. April 2013 08:49
  • Das Problem wird sein, dass das übergeordnete Steuerelement nicht die nötige Breite hat. Du musst im Grunde im Control-Baum nur weit genug nach oben gehen und die Spaltenbreite weit genug setzen (beispielsweise per Width="*"), dann müsste das gehen.

    Karsten Samaschke
    Entwickler, Trainer, Autor, Coach
     
    karsan.de - mein Weblog
    <a href="http://www.abteilung-mobil.de>Wir sind Ihre Abteilung Mobil!

    Montag, 8. April 2013 09:27
  • Wenn ich dem Grid Width="*" gebe bekomme ich eine uhandled xaml exception wenn ich meine app ausführe.

    GridView.HeaderTemplate und DataTemplate kann ich keine Width Eigenschaft zuweisen.

    Kannst du mir vielleicht einen konkreteren Ansatz liefern?

    Mittwoch, 10. April 2013 12:00
  • Width="*" geht nur bei ColumnsDefinition's. Allgmein scheint es kaum eine wirklich eifnache Lösung zu geben. Möglich ist es aber, auch wenn es in meinen Aufgen unnötig kompliziert ist, wie so vieles bei den Win8 Apps...

    Als erstes brauchst du einen Konverter:

        class WidthConverter : IValueConverter
        {
            #region IValueConverter Member
    
            public object Convert(object value, Type targetType, object parameter, string language)
            {
                int x;
                if (parameter != null)
                    x = int.Parse(parameter.ToString());
                else
                    x = 1;
                if ((int)value % x == 0)
                    return (int)value / x * 260 - 5;
                else
                    return ((int)value / x + 1) * 260 - 5;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, string language)
            {
                throw new NotImplementedException();
            }
    
            #endregion
        }

    XML-Resource:

            <local:WidthConverter x:Key="WidthConverter"/>

    und nun musst du die Breite des Grids binden:

     <Grid Width="{Binding Items.Count, Converter={StaticResource WidthConverter}, ConverterParameter=2}">

    uns jetzt kommt das nervige daran. Der Convertparameter 2 passt bei den meisten Bildschirmauflösungen. Aber bei einem 1080p Monitor wird das nichts mehr... Da baucht man dann 3 und bei ncoh höheren Auflösungen dann 4 usw...

    Liegt daran das es keine Multibindings gibt (warum bitte nicht!?). ConvertParameter kann man leider auch nicht binden. Ich glaube das das momentan die einzige Möglichkeit ist. Leider.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    • Als Antwort markiert KonstantinOtte Donnerstag, 11. April 2013 07:43
    Mittwoch, 10. April 2013 13:12
  • Vielen Dank für deine Lösung! Sie hat mir vorerst ausgeholfen. Wenngleich es keine perfekte Lösung zu geben scheint ist diese doch vom Aufwand gering und erzielt ein gutes Ergebnis. Die größeren Auflösungen sollen mich ersteinmal nicht stören. 

    Donnerstag, 11. April 2013 07:45