0

そのため、文字列配列を回転するスクロール テキスト (マーキー) を含むプロジェクトがあります。そして、各アニメーション反復の 20 秒後に文字列値を変更したいと考えています。

ただし、問題があります。INotifyPropertyChanged インターフェイスを使用して (XAML を使用して) テキストブロックにバインドするプロパティ (ScrollingText) は、最初の反復後に返されません。(セット部分で)正常に更新されても、ゲッター部分では返されません....デフォルトのctorの最初のセットを除いて。

主なクラス:

class GetScrollingText : CommonBase
{
    private string _scrollingtext = String.Empty;
    DoubleAnimation Animation;

    public GetScrollingText()
    {
        ScrollingText = GetScrollString();
    }

    public string ScrollingText
    {
        get
        {
            return _scrollingtext;
        }
        set
        {
            if (value != _scrollingtext)
            {
                _scrollingtext = value;
                RaisePropertyChanged("ScrollingText");
            }               
        }
    } // INJECTS the string in the animated textblock {binding}.

    public TextBlock scrollBlock { get; set; }

    string GetScrollString()
    {
        .........
        return scrolltext;
    }      

    public void LeftToRightMarqee(double from, double to)
    {
        Animation = new DoubleAnimation();
        Animation.From = from;
        Animation.To = to;
        Animation.Duration = new Duration(TimeSpan.FromSeconds(20));
        Animation.Completed += animation_Completed;
        scrollBlock.BeginAnimation(Canvas.LeftProperty, Animation);
    }

    void animation_Completed(object sender, EventArgs e)
    {
        ScrollingText = GetScrollString();           
        scrollBlock.BeginAnimation(Canvas.LeftProperty, Animation);
    }
}

何らかの理由で、animation_Completed イベントは値 ScrollingText のみを変更しますが、Getter 部分を呼び出さないため、{binding} への戻りはありません。

XAML:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:AnnouncingSys"
    x:Class="AnnouncingSys.MainWindow"
    x:Name="Window"
    Width="1280" Height="720" MinHeight="566" MinWidth="710">

    <Window.Resources>
        <vm:GetScrollingText x:Key="ScrollingText"/>
    </Window.Resources>
    <Canvas x:Name="MainCanvas" ClipToBounds="True" Margin="0,0,0,0" Grid.Row="5" Background="Black" Grid.ColumnSpan="5" >
        <TextBlock x:Name="ScrollBlock" TextWrapping="Wrap" VerticalAlignment="Top" Height="113" Width="5147" Canvas.Left="-1922" Text="{Binding ScrollingText, Source={StaticResource ScrollingText}}"/>
    </Canvas>
</Window>

コードビハインド:

public partial class MainWindow : Window
{
    GetScrollingText scrolling = new GetScrollingText();

    public MainWindow()
    {
        InitializeComponent();
        scrolling.scrollBlock = this.ScrollBlock;
        scrolling.LeftToRightMarqee(2000, -3000);
    }
}

最後に、ヘルパー クラス CommonBase:

public class CommonBase : INotifyPropertyChanged
{
    protected CommonBase()
    {
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string PropertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;

        if (handler != null)
        {
            PropertyChangedEventArgs e = new PropertyChangedEventArgs(PropertyName);
            handler(this, e);
        }
    }
}

Getter の return ブロックにもブレークポイントを設定しましたが、最初の "ScrollingText = GetScrollString()" でのみアクティブになります。つまり、値が変更されるたびに戻るべきではありませんか???

4

1 に答える 1

2

クラスの 2 つの異なるインスタンスを使用していますGetScrollingText。1 つは XAML で StaticResource として、もう 1 つはコード ビハインドscrollingでクラス MainWindow のフィールドとして使用しています。

DataContextXAML で StaticResource を作成する代わりに、MainWindow のプロパティを設定するだけです。

public partial class MainWindow : Window
{
    GetScrollingText scrolling = new GetScrollingText();

    public MainWindow()
    {
        InitializeComponent();
        scrolling.scrollBlock = this.ScrollBlock;
        scrolling.LeftToRightMarqee(2000, -3000);
        DataContext = scrolling; // here
    }
}

SourceDataContext が既定のバインディング ソースとして使用されるため、バインディングのプロパティを明示的に設定しません。

<TextBlock ... Text="{Binding ScrollingText}"/>
于 2015-01-24T13:43:23.437 に答える