locked
איך גורמים לאקספנדר לעלות מעל הקונטרולים שמתחתיו במקום לדחוף אותם למטה RRS feed

  • שאלה

  • תודה על התשובה,היה נחמד להכיר את הבלנד.

    אני מעונין שהאקספנדר נפתח, הוא יעלה על הפקד שנמצא מתחתיו ולא יוריד אותו למטה.

    זה גם קשור לפקד או לעיצוב הכללי?

    תודה.


    • נערך על-ידי 8Menny יום שני 23 ינואר 2012 07:20
    • פוצל על-ידי Elad R Katz יום שני 23 ינואר 2012 08:35 שאלה נוספת
    יום שני 23 ינואר 2012 07:19

תשובות

  • זה כבר תלוי בקונטרול עצמו - אקספנדר פשוט לא עובד ככה. בשביל שקונטרול ידע "לעלות" מעל קונטרולים אחרים (כמו ש Menu או ComboBox עושים) צריך להשתמש בקונטרול Popup (אם תסתכל בתוך הטמפלט שלהם תראה שהם משתמשים בPopup בפנים.

    הקונטרול Popup הוא מעין חלון חדש (ב WPF הוא ממש חלון חדש) ולכן הוא יכול להמצא מעל אלמנטים אחרים. ליצור כזה קונטרול מאפס או לשנות את הטמפלט של Expander כך שיתנהג כך לא אמור להיות קשה מדי. כרפרנס להתחלה, ראה את הקוד הזה:

     

        <Grid x:Name="LayoutRoot" Background="White">
    
    		<Grid Width="100" Height="60" >
    			<Grid.RowDefinitions>
    				<RowDefinition />
    				<RowDefinition />
    			</Grid.RowDefinitions>
    			<TextBox Text="Hello" />
    			<Popup IsOpen="True" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" >
    				<Button Content="Hello" />
    			</Popup>
    			<Button Grid.Row="1" />
    		</Grid>
    	</Grid>
    
    

     שים לב שה Popup מתעלם מהגדרות VerticalAlignment ו HorizontalAlignment היות והוא לא נמצא בכלל באותו עץ ויזואלי כמו האלמנטים האחרים - הוא בחלון אחר בכלל.

    • סומן כתשובה על-ידי Elad R Katz יום שני 06 פברואר 2012 16:56
    יום שני 23 ינואר 2012 09:06

כל התגובות

  • זה כבר תלוי בקונטרול עצמו - אקספנדר פשוט לא עובד ככה. בשביל שקונטרול ידע "לעלות" מעל קונטרולים אחרים (כמו ש Menu או ComboBox עושים) צריך להשתמש בקונטרול Popup (אם תסתכל בתוך הטמפלט שלהם תראה שהם משתמשים בPopup בפנים.

    הקונטרול Popup הוא מעין חלון חדש (ב WPF הוא ממש חלון חדש) ולכן הוא יכול להמצא מעל אלמנטים אחרים. ליצור כזה קונטרול מאפס או לשנות את הטמפלט של Expander כך שיתנהג כך לא אמור להיות קשה מדי. כרפרנס להתחלה, ראה את הקוד הזה:

     

        <Grid x:Name="LayoutRoot" Background="White">
    
    		<Grid Width="100" Height="60" >
    			<Grid.RowDefinitions>
    				<RowDefinition />
    				<RowDefinition />
    			</Grid.RowDefinitions>
    			<TextBox Text="Hello" />
    			<Popup IsOpen="True" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" >
    				<Button Content="Hello" />
    			</Popup>
    			<Button Grid.Row="1" />
    		</Grid>
    	</Grid>
    
    

     שים לב שה Popup מתעלם מהגדרות VerticalAlignment ו HorizontalAlignment היות והוא לא נמצא בכלל באותו עץ ויזואלי כמו האלמנטים האחרים - הוא בחלון אחר בכלל.

    • סומן כתשובה על-ידי Elad R Katz יום שני 06 פברואר 2012 16:56
    יום שני 23 ינואר 2012 09:06
  • מסכים לגמרי עם אלעד - אם זה הצורך צריך לחשוב על קונטרול אחר.

    לצורך ההשתעשעות ברעיון (בלבד) אפשר להציע את הפתרון הזה, שכן עובד עם expander:

    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="50"></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            
            <Expander Header="My Expander" Grid.IsSharedSizeScope="True" Panel.ZIndex="1000" >
                <Expander.Style>
                    <Style TargetType="Expander">
                        <Style.Triggers>
                            <Trigger Property="IsExpanded" Value="True">
                                <Setter Property="Grid.RowSpan" Value="2"></Setter>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Expander.Style>
                <StackPanel Background="White">
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                    <TextBlock Text="A"></TextBlock>
                </StackPanel>
            </Expander>
            
            <TextBlock Text="Second Row" Grid.Row="1" Panel.ZIndex="1"></TextBlock>
        </Grid>
    

    שים לב ל -ZIndex הגבוה וה- Background של ה-  StackPanel,

    זה בעצם מה שעושה את ההבדל.

     

    יום שני 23 ינואר 2012 09:18
  • אסף - שימוש ב zindex בשביל דברים כאלו זה מאוד לא נוח. עדיף לצאת מהעץ הויזואלי לגמרי כי אחרת אתה צריך להתחשב בלא מעט דברים. 
    בנוסף, עקרונית הדרך העדיפה היא לשנות את הטמפלט של אקספנדר ולא לבחור קונטרול אחר מאפס.  
    יום שני 23 ינואר 2012 11:01
  • אמנם כבר קיבלת תשובה קונקרטית אבל אנסה לתת פתרון בסיסי יותר,

    הדרך הפשוטה שבה פותרים בעיה מהסוג הזה היא פשוט להעביר את האקספנדר כך שיופיע בXAML אחרי הפקדים האחרים. כלומר שיהיה מעליהם בסידור שכבות התצוגה (זה מסדר את ה Zindex) שם לב שזה לא יעבוד עם stackPanel שבו סדר ההוספה הוא גם סדר התצוגה, אבל יעבוד במקרים שבהם יש לך גריד או פאנל שבו ניתן לשלוט במיקום ללא קשר לסדר.

    אם אתה מסדר את הרכיבים בגריד אז תגדיר את המיקום (Grid.Column, Grid.Row)  אבל תעביר את האקספנדר לסוף הקובץ.

     

    יום ראשון 05 פברואר 2012 05:50