none
בעיות בשימוש בWindowChrome עם הפרופרטיז הבאים WindowStyle = None, AllowsTransparency = true RRS feed

  • שאלה

  • יש לי אפליקציית WPF אשר הmain shell בנוי עם WindoChrome כך:

    XAML:

    <Style TargetType="{x:Type local:MainLayoutWindow}">
        <Setter Property="shell:WindowChrome.WindowChrome">
            <Setter.Value>
                <shell:WindowChrome 
                        GlassFrameThickness="0"
                        ResizeBorderThickness="7"
                        CaptionHeight="36"
                        CornerRadius="3"                    
                        />
            </Setter.Value>
        </Setter>
        <Setter Property="WindowState" Value="Maximized" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:MainLayoutWindow}">
                    <Border>
                        <Border.Style>
                            <Style TargetType="{x:Type Border}">
                                <Setter Property="BorderThickness" Value="{Binding WindowResizeBorderThickness}"/>
                            </Style>
                        </Border.Style>
                        <Grid x:Name="Root" >
    
                            <Grid>
                                <!-- Content Border -->
    
                                <!-- Header -->
    
                            </Grid>
                            <!-- Buttons -->
                            <Border BorderBrush="{StaticResource WindowButtonOutline}" BorderThickness="1,0,1,1" CornerRadius="0,0,3,3" VerticalAlignment="Top" Margin="7,1,0,0" HorizontalAlignment="Left">
                                <StackPanel Orientation="Horizontal">
    
                                    <Button x:Name="PART_btnClose"   Height="17" Width="35" IsTabStop="False" shell:WindowChrome.IsHitTestVisibleInChrome="True" >
    
                                    </Button>
                                    <Button x:Name="PART_btnMaxAndNormal" Height="17" Width="24" IsTabStop="False" shell:WindowChrome.IsHitTestVisibleInChrome="True" >
    
                                    </Button>
                                    <Button x:Name="PART_btnMinimize"   Height="17" Width="24" IsTabStop="False" shell:WindowChrome.IsHitTestVisibleInChrome="True" >
    
                                    </Button>
    
                                </StackPanel>
    
    
                            </Border>
                        </Grid>
                    </Border>
    
                    <ControlTemplate.Triggers>
    
                        <Trigger Property="WindowState" Value="Maximized">
                            <Setter Property="shell:WindowChrome.WindowChrome">
                                <Setter.Value>
                                    <shell:WindowChrome ResizeBorderThickness="0"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                        <Trigger Property="WindowState" Value="Normal">
                            <Setter Property="shell:WindowChrome.WindowChrome">
                                <Setter.Value>
                                    <shell:WindowChrome ResizeBorderThickness="7"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
    
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    CS:

    public MyWindow()
        {
            this.AllowsTransparency = true;
            this.WindowStyle = System.Windows.WindowStyle.None;
            this.Caption = "some text";
            this.StateChanged += MainLayoutWindow_StateChanged;
        }
    
        void MainLayoutWindow_StateChanged(object sender, EventArgs e)
        {
            if (this._myVM== null) return;
            this._myVM.SetState(this.WindowState);
        }
    
        public MyWindow(MyVM myVM)
            : this()
        {
            this.DataContext = mainVM;
            this._myVM= myVM;
        }
    
        Thickness _maximizeThickness = new Thickness(8, 8, 8, 8);
        Thickness _normalThickness = new Thickness(0, 0, 0, 0);
        Thickness _windowResizeBorderThickness = new Thickness(0, 0, 0, 0);
        const string WINDOWRESIZEBORDERTICKNESS = "WindowResizeBorderThickness";
        public Thickness WindowResizeBorderThickness
        {
            get
            {
                return _windowResizeBorderThickness;
            }
            set
            {
                if (_windowResizeBorderThickness != value)
                {
                    _windowResizeBorderThickness = value;
                    OnPropertyChanged(WINDOWRESIZEBORDERTICKNESS);
                }
            }
        }
    
        public void SetState(WindowState windowState)
        {
            if (windowState == WindowState.Maximized)
            {
                WindowResizeBorderThickness = _maximizeThickness;
            }
            else
            {
                WindowResizeBorderThickness = _normalThickness;
            }
        }

    בעיות:

    1. אם אני לא משתמש בAllowsTransparency = true, WindowStyle=None, זה נראה כאילו לפעמים הכפתורים המקוריים מוצגים בזמן הלוגין למערכת.
    2. אם אני משתמש בAllowsTransparency = true, WindowStyle=None, החלון הראשי תופס את כל המסך (מסתיר את הtaskbar), בעיה נוספת - אם יש לי 2 מסכים, ואני מעביר את האפליקציה ממסך אחד (ראשי) למסך השני במצב maximize, הכל בסדר ותקין, אולם איני יכול להחזיר חזרה למסך הראשי במצב maximize, ניתן להחזיר למסך הראשי רק במצב normal?

    רעיון? עזרה? תודה!

    יום רביעי 17 יוני 2015 16:00

תשובות

  • הבעיה היתה שבזמן הלוגין יש כל מיני דברים שעולים ברקע, הייתי צריך להעביר את הדברים ל Dispatcher.BeginInvoke, במקום להשתמש בDispatcher.Invoke, הבעיות התגלו בזמן המעבר לשימוש בWindowChrome, אבל כעת ביטלתי את השימוש בWindowChrome כי זה פשוט דופק לי מספר דברים בהתנהגות האפליקציה עד כה - כל מיני תקלות מוזרות שכנראה מתנגשות בWindowChrome לבין העיצוב של האפליקציה..
    • סומן כתשובה על-ידי DavidMichaeli יום חמישי 20 אוגוסט 2015 20:56
    יום חמישי 20 אוגוסט 2015 20:56

כל התגובות

  • לא הספקתי עדיין לעבור על השאלה... זה ידחה כניראה, אבל אני לא מבין למה אתה מביא לנו קוד של צד שרת אם הבעיה היא בדפדפן. תבדוק את הקוד שמגיע לכרום ותבדוק אם תקין או לא. אחרי שתתקן את הקוד בצד הדפדפן תוכל לחזור לצד השרת ולחשוב מה יצר את הקוד בצד הדפדפן כדי לתקן את זה

    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    יום רביעי 17 יוני 2015 17:14
    מנחה דיון
  • זה לא סילברלייט:) אלא WPF:)
    משום מה, סעיף 1 מאוד חמקמק וקשה להבין מתי זה קורה כי זה קורה רק פעם ב....
    יום רביעי 17 יוני 2015 22:06
  • אהלן :-)

    כמו שאמרתי לא עברתי בכלל על התוכן של ההודעה אלא פשוט קפצו לי לעיניים כמה מילים
    כמה מילים עם חוסר שינה נותנים מסקנות מצחיקות לפעמים :-)

    ראיתי את המילה CHROME ולא שמתי לב שזה WindoChrome 
    ראיתי קוד של XAML שניראה במבט מהיר כמו קוד של HTML וחשבתי מייד על פיתוח אפליקצייה אינטרנטית (לא חשבתי על SILVERLIGHT אלא משהו כמו ASP.NET)
    בכל מקרה כמובן שההודעה הקודמת שלי היתה שטות ולא רלוונטית :-)

    * אני לא מפתח ב WPF ויש פורום ייעודי ל WPF 
    אז אם אתה רוצה אני אעביר את השאלה לפורום שם. אנא הודע לי


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    יום חמישי 18 יוני 2015 12:32
    מנחה דיון
  • אין צורך, הבנתי מה הבעיה :)
    יום ראשון 21 יוני 2015 09:02
  • בכיף,

    אתה מוזמן לשים את ההסבר שלך לטובת אחרים ולסגור את השרשור :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    יום ראשון 21 יוני 2015 11:29
    מנחה דיון
  • הבעיה היתה שבזמן הלוגין יש כל מיני דברים שעולים ברקע, הייתי צריך להעביר את הדברים ל Dispatcher.BeginInvoke, במקום להשתמש בDispatcher.Invoke, הבעיות התגלו בזמן המעבר לשימוש בWindowChrome, אבל כעת ביטלתי את השימוש בWindowChrome כי זה פשוט דופק לי מספר דברים בהתנהגות האפליקציה עד כה - כל מיני תקלות מוזרות שכנראה מתנגשות בWindowChrome לבין העיצוב של האפליקציה..
    • סומן כתשובה על-ידי DavidMichaeli יום חמישי 20 אוגוסט 2015 20:56
    יום חמישי 20 אוגוסט 2015 20:56