يؤثر الرسوم المتحركة على الحدود WPF على جميع الضوابط الموجودة؟

StackOverflow https://stackoverflow.com/questions/1701865

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أستخدم متوسع WPF لعرض عدد من متغيرات العملية التناظرية.

أريد أن أجعل الحدود المتوسطة "توهج" (أو فلاش) عندما يدخل أحد هذه المتغيرات "تحذير" أو "إنذار".

لتحقيق ذلك، أنا أستخدم بعض مشغلات البيانات ملزمة بضع خصائص منطقية في نموذج الرأي الخاص بي ("Analogwarningactive" و "AnalogalarmActive"). تبدأ البيانات المشغلات القصة المصورة التي تنفذ عتامة الحدود المتوسطة.

تعمل البيانات على العمل كما أتوقع: يظهر لون الحدود المناسب ويبدأ الرسوم المتحركة العتامة. ومع ذلك، هناك 2 مشاكل:

  1. تعتذ عتامة المتوسع بأكملها (وكل الضوابط الواردة) وليس مجرد عتامة حدودها.

  2. عندما تعود العلامات "Analogwarningactive" و "العلامات" التشريعية "إلى False، تختفي الحدود، لكن الرسوم المتحركة Opactiy تستمر إلى أجل غير مسمى (أي ما يستمر المتوسع بأكمله يتلاشى داخل وخارج).

هنا هو XAML أنا أستخدم:

<SolidColorBrush x:Key="AnalogAlarmBrush" Color="#FFFF8080" />
<SolidColorBrush x:Key="AnalogWarningBrush" Color="#FFFFFF80" />

<Storyboard x:Key="AlarmBorderFlasher" AutoReverse="True" RepeatBehavior="Forever">
    <DoubleAnimation  
        Storyboard.TargetProperty="(Border.Opacity)" 
        From="1.0" To="0.4" 
        Duration="0:0:0.8" />
</Storyboard>

<Expander Header="Test Data" IsExpanded="True">
    <Expander.Style>
        <Style TargetType="{x:Type Expander}">
            <Style.Triggers>

                <DataTrigger Binding="{Binding Path=AnalogWarningActive}" Value="True" >

                    <DataTrigger.EnterActions>
                        <BeginStoryboard Name="WarningBorderStoryboard" Storyboard="{StaticResource AlarmBorderFlasher}" />
                    </DataTrigger.EnterActions>
                    <DataTrigger.ExitActions>
                        <StopStoryboard BeginStoryboardName="WarningBorderStoryboard" />
                    </DataTrigger.ExitActions>

                    <DataTrigger.Setters>
                        <Setter Property="BorderBrush" Value="{StaticResource AnalogWarningBrush}" />
                        <Setter Property="BorderThickness" Value="4" />
                    </DataTrigger.Setters>

                </DataTrigger>

                <DataTrigger Binding="{Binding Path=AnalogAlarmActive}" Value="True" >

                    <DataTrigger.EnterActions>
                        <BeginStoryboard Name="AlarmBorderStoryboard" Storyboard="{StaticResource AlarmBorderFlasher}" />
                    </DataTrigger.EnterActions>
                    <DataTrigger.ExitActions>
                        <StopStoryboard BeginStoryboardName="AlarmBorderStoryboard" />
                    </DataTrigger.ExitActions>

                    <DataTrigger.Setters>
                        <Setter Property="BorderBrush" Value="{StaticResource AnalogAlarmBrush}" />
                        <Setter Property="BorderThickness" Value="4" />
                    </DataTrigger.Setters>

                </DataTrigger>

            </Style.Triggers>
        </Style>
    </Expander.Style>

    <!-- snipped the contents of the expander (a tabcontrol and a few text boxes, labels, etc)-->

</Expander>
هل كانت مفيدة؟

المحلول

السؤال رقم 1

يؤثر إعداد التعتيم على مرئي مثل الحدود على أن المرئيات وكل أحفادها. هذا هو السبب في تحديد الحدود. العبادة يجعل كل شيء تختفي.

لديك خياران: 1. تحريك خاصية السكتة الدماغية الحدودية، أو 2. تغيير المحتوى لعدم أن يكون سلسته من الحدود.

تعتبر Animating The Stroke Property Travial To Code، ولكن لديها العيب الذي لا يتمتع بجميع الفرش بسهولة للشفافية والظهر. على سبيل المثال، هذا صعب مع فرش التدرج. أيضا، إذا كانت حدودك مجموعة متنوعة من الألوان ولم ترغب في الذهاب إلى 100٪ شفافة، فلا توجد طريقة جيدة لتحريك السكتة الدماغية دون تغيير اللون.

تغيير المحتوى لعدم أن يكون سليلا للحدود بسيطة للغاية، وهو ما سأميله للقيام به في معظم الحالات. ببساطة استبدال:

<Border x:Name="MyBorder" Stroke="Red" StrokeThickness="3" CornerRadius="6">
  <my:ContentHere />
</Border>

مع هذا:

<Grid>
  <Border x:Name="MyBorder" Stroke="Red" StrokeThickness="3" Stroke="Red" CornerRadius="6">
  <Border Stroke="Transparent" StrokeThickness="3" CornerRadius="Red">
    <my:ContentHere />
  </Border>
</Grid>

الآن يمكن تحريك عتامة الحدود المرئية، في حين أن الشخص الشفاف يتحكم في تخطيط الطفل وقطعه.

إذا لم يكن لديك أي كورنراديوس أو أعمال مضحكة أخرى، فيمكنك فقط تعيين هامش على المحتوى وفرجا الحدود الشفافة:

<Grid>
  <Border x:Name="MyBorder" Stroke="Red" StrokeThickness="3" />
  <my:ContentHere Margin="3" />
</Grid>

السؤال 2

للوهلة الأولى، لا أرى أي مشكلة مع XAML الخاصة بك والتي من شأنها أن تسبب الرسوم المتحركة في الركض بعد تعود قيمة النماذج إلى خطأ، لكنني لم أنظر عن كثب. من ما لاحظته وأعتقد أنه سيتوقف عن الرسوم المتحركة بالقيمة الحالية، وليس تركها قيد التشغيل.

قد تحاول استبدال لوحة التوقف باستخدام لوحة التصفية. يجب إعادة تعيين RemoveStoryboard إلى إعادة تعيين الخصائص المتحركة إلى قيمها الأصلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top