উইন্ডোজ ফোন 7 এমুলেটরটিতে টেক্সটবক্স.টেক্সট চেঞ্জড ইভেন্টের দু'বার আগুন


91

উইন্ডোজ ফোন with এর সাথে ঘুরে দেখার জন্য আমার খুব সাধারণ পরীক্ষার অ্যাপ্লিকেশন রয়েছে I've আমি সমিত স্ট্যান্ডার্ড ইউআই টেমপ্লেটে একটি TextBoxএবং একটি যুক্ত করেছি TextBlock। একমাত্র কাস্টম কোডটি নিম্নলিখিত:

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private int counter = 0;

    private void TextBoxChanged(object sender, TextChangedEventArgs e)
    {
        textBlock1.Text += "Text changed " + (counter++) + "\r\n";
    }
}

TextBox.TextChangedঘটনা পর্যন্ত ওয়্যার্ড হয় TextBoxChangedXAML মধ্যে:

<TextBox Height="72" HorizontalAlignment="Left" Margin="6,37,0,0"
         Name="textBox1" Text="" VerticalAlignment="Top"
         Width="460" TextChanged="TextBoxChanged" />

যাইহোক, আমি যখনই এমুলেটরটিতে চলার সময় কোনও কী টিপবই (অন-স্ক্রীন কীবোর্ড বা শারীরিক যাকে, পরেটিকে সক্ষম করার জন্য বিরতি দিয়ে চাপ দেওয়া হয়েছে) এটি দুটি বারে দুটি লাইন প্রদর্শন করে কাউন্টারটিকে বাড়িয়ে তোলে TextBlock। আমি যা কিছু চেষ্টা করেছি তা দেখায় যে ইভেন্টটি সত্যিকার অর্থে দু'বার গুলি চালাচ্ছে এবং কেন তা আমার কোনও ধারণা নেই। আমি যাচাই করেছি যে এটি কেবল একবারই সাবস্ক্রাইব করা হচ্ছে - যদি আমি MainPageকনস্ট্রাক্টরে সাবস্ক্রাইব করি , পাঠ্য পরিবর্তিত হলে কিছুই (টেক্সট ব্লকের কাছে) কিছুই হয় না।

আমি নিয়মিত সিলভারলাইট অ্যাপে সমমানের কোডটি চেষ্টা করেছি এবং এটি সেখানে ঘটে না didn't এই মুহুর্তে এটি পুনরুত্পাদন করার জন্য আমার কাছে কোনও শারীরিক ফোন নেই। উইন্ডোজ ফোন 7-এ এর পরিচিত সমস্যা হিসাবে এর কোনও রেকর্ড আমি পাইনি।

আমি কী ভুল করছি তা কি কেউ ব্যাখ্যা করতে পারেন, বা আমাকে এটি একটি বাগ হিসাবে রিপোর্ট করা উচিত?

সম্পাদনা: এর দুটি পাঠ্য নিয়ন্ত্রণ থাকার সম্ভাবনা হ্রাস করার জন্য, আমি TextBlockসম্পূর্ণরূপে অপসারণ করার চেষ্টা করেছি এবং পাঠ্যবক্সচ্যাঞ্জড পদ্ধতিটি কেবলমাত্র বৃদ্ধিতে পরিবর্তন করেছি counter। এরপরে আমি এমুলেটরটি চালিয়েছি, 10 টি অক্ষর টাইপ করেছি এবং তারপরেcounter++; লাইনে একটি ব্রেকপয়েন্ট রেখেছি (কেবলমাত্র ডিবাগারের মধ্যে ভাঙ্গা সমস্যার কারণ হতে পারে এমন কোনও সম্ভাবনা থেকে মুক্তি পেতে) - এবং এটি counter20 হিসাবে দেখায় ।

সম্পাদনা: আমি এখন উইন্ডোজ ফোন 7 ফোরামে জিজ্ঞাসা করেছি ... আমরা কী করব তা দেখব।


মাত্র আগ্রহের বাইরে - আপনি যদি ইভেন্টটির ভিতরে যাচাই করেন তবে ইভেন্টে উভয় সময় টেক্সটবক্সের বিষয়বস্তু কি একই রকম হয়? আমি জানি না কেন এটি ঘটবে, কারণ আমি সাধারণত এই জিনিসগুলির জন্য ইভেন্ট হ্যান্ডলিংয়ের পরিবর্তে এমভিভিএম এবং ডেটা বাইন্ডিং ব্যবহার করি (সিলভারলাইট এবং ডাব্লুপিএফ, ডাব্লুপি 7 এর সাথে খুব বেশি অভিজ্ঞতা নয়)।
রুন জ্যাকবসেন

@ রুন: হ্যাঁ, আমি দু'বার "পরে" পাঠ্যটি দেখছি। সুতরাং আমি যদি "h" টিপুন এবং textBox1.Textপাঠ্যব্লক 1 সংযোজনের অংশ হিসাবে প্রদর্শন করি তবে এটি উভয় লাইনে "এইচ" প্রদর্শন করবে।
জন স্কিটে

4
আপনি 2 টি কীবোর্ড উল্লেখ করেছেন, এটি কি কোনও কারণ হতে পারে? আপনি কি একটি অক্ষম করতে পারেন? এবং সম্ভবত আপনি পরীক্ষা করতে পারেন টেক্সট চ্যাঞ্জডএভেন্টআরগসের সমস্ত সদস্য উভয় কলেই সমান কিনা?
হেন্ক হলটারম্যান

@ হেনক: বেশিরভাগ সময় আমি শারীরিক কীবোর্ড সক্ষম করার জন্য বিরক্ত করিনি ... কেবল এটির প্রভাব ফেলবে কিনা তা দেখার জন্য। TextChangedEventArgsসত্যিই প্রচুর পরিমাণে উপলব্ধ নেই - কেবলমাত্র OriginalSource, যা সর্বদা শূন্য।
জন স্কিটি

4
এটি কোনও ত্রুটির মতো দেখতে লাগে না, এটি কীবোর্ডের সাথে সম্পর্কিত নয় কারণ আপনি কেবলমাত্র টেক্সট সম্পত্তিটিতে একটি নতুন মান নির্ধারণ করে একই ফলাফল পেতে পারেন, টেক্সটচ্যাঞ্জডটি এখনও দু'বার জ্বলতে থাকে।
অ্যান্থনিডব্লু জোন্স

উত্তর:


75

TextChangedডাব্লুপি in এ ইভেন্টটি দু'বার আগুন লাগার কারণটি কীভাবে TextBoxমেট্রোর বর্ণনটির জন্য প্ররোচিত করা হয়েছে তার একটি পার্শ্ব প্রতিক্রিয়া ।

আপনি TextBoxমিশ্রণে টেম্পলেটটি সম্পাদনা করলে আপনি দেখতে পাবেন যে এতে TextBoxঅক্ষম / কেবল পঠনযোগ্য রাষ্ট্রের জন্য একটি মাধ্যমিক রয়েছে । এটি একটি পার্শ্ব প্রতিক্রিয়া হিসাবে, ইভেন্টটি দু'বার আগুন লাগায়।

অতিরিক্ত TextBox(এবং সম্পর্কিত রাজ্যগুলি) অপসারণের জন্য আপনি টেমপ্লেট পরিবর্তন করতে পারেন, যদি আপনার এই রাজ্যের প্রয়োজন না হয়, বা কোনও মাধ্যমিক ব্যবহার না করে অক্ষম / পঠনযোগ্য রাষ্ট্রের আলাদা চেহারা অর্জনের জন্য টেমপ্লেটটি সংশোধন করতে পারেন TextBox

এটির সাথে, ইভেন্টটি কেবল একবারই চালিত হবে।


18

আমি বাগের জন্য যাব, মূলত কারণ যদি আপনি ইভেন্টগুলি KeyDownএবং KeyUpইভেন্টগুলিকে সেখানে রাখেন তবে এটি দেখায় যে এগুলি কেবল একবার (তাদের প্রত্যেককে) TextBoxChangedগুলি করা হয়েছে তবে ইভেন্টটি দুটি বার নিক্ষেপ করা হয়েছে


@ আন্ডারটেকার: কিছুটা দেখার জন্য ধন্যবাদ আমি ডাব্লুপি--নির্দিষ্ট ফোরামে একই প্রশ্ন জিজ্ঞাসা করব এবং প্রতিক্রিয়া কী তা দেখব ...
জন স্কিট

টেক্সটইনপুট কী করে? এগুলি ডাব্লুপি 7 এর ইউনিট পরীক্ষাগুলির মধ্য দিয়ে পিছলে যেতে বেশ বড় বাগের মতো মনে হয় তবে তারপরে এটি এসএল
ক্রিস এস

@ ক্রিস এস: "কী করে TextInput?" বলতে আপনার অর্থ কী ? আমি এর সাথে পরিচিত নই TextInput...
জন স্কিটি

@ জোন `অনটেক্সটইনপুট (টেক্সট কম্পোজিশন এভেন্টস ই)` কীডাউনের পরিবর্তে পাঠ্য ইনপুট পরিচালনা করার এসএল উপায়, স্পষ্টতই ডিভাইসটির কোনও কীবোর্ড নাও থাকতে পারে: "যখন কোনও ইউআই উপাদান ডিভাইস-স্বতন্ত্র পদ্ধতিতে পাঠ্য পেয়ে থাকে" এমএসডিএন.মাইক্রোসফ্ট। কম / এন-ইউএস / লাইব্রেরি /…
ক্রিস এস

আমি কেবল কৌতূহল ছিলাম যদি তাও দ্বিগুণ হয়ে যায়
ক্রিস এস

8

এটি আমার কাছে বাগের মতো শোনাচ্ছে। কাজের মত হিসাবে, আপনি সর্বদা আরএক্স ব্যবহার করতে পারেন DistinctUntilChanged। একটি ওভারলোড রয়েছে যা আপনাকে আলাদা কীটি নির্দিষ্ট করতে দেয়।

এই এক্সটেনশন পদ্ধতিটি পর্যবেক্ষণযোগ্য পাঠ্য-পরিবর্তিত ইভেন্টটি দেয় কিন্তু পরপর নকলগুলি এড়িয়ে যায়:

public static IObservable<IEvent<TextChangedEventArgs>> GetTextChanged(
    this TextBox tb)
{
    return Observable.FromEvent<TextChangedEventArgs>(
               h => textBox1.TextChanged += h, 
               h => textBox1.TextChanged -= h
           )
           .DistinctUntilChanged(t => t.Text);
}

বাগ ঠিক হয়ে গেলে আপনি কেবল DistinctUntilChangedলাইনটি সরাতে পারেন ।


2

সুন্দর! একটি সম্পর্কিত সমস্যা অনুসন্ধান করে আমি এই প্রশ্নটি পেয়েছি এবং আমার কোডটিতে এই বিরক্তিকর জিনিসটিও পেয়েছি। ডাবল ইভেন্টটি আমার ক্ষেত্রে আরও সিপিইউ রিসোর্স খায়। সুতরাং, আমি এই সমাধানটি দিয়ে আমার রিয়েল-টাইম ফিল্টার পাঠ্যবাক্সটি ঠিক করেছি:

private string filterText = String.Empty;

private void SearchBoxUpdated( object sender, TextChangedEventArgs e )
{
    if ( filterText != filterTextBox.Text )
    {
        // one call per change
        filterText = filterTextBox.Text;
        ...
    }

}

1

আমি বিশ্বাস করি যে এটি কমপ্যাক্ট ফ্রেমওয়ার্কে সর্বদা একটি বাগ ছিল। এটি অবশ্যই ডাব্লুপি 7 এর মধ্যে দিয়ে গেছে।


আমি ভেবেছিলাম এটি সিএফ-র একটি সাম্প্রতিকতম সংস্করণে ঠিক করা হয়েছে ... এবং সিলভারলাইটে স্থানান্তর সত্ত্বেও এটি প্রবেশ করা অদ্ভুত হবে। অন্যদিকে, এটি দেখতে খুব সুন্দর একটি অদ্ভুত ত্রুটি ...
জন স্কিট

আমি একমত যে এটি অদ্ভুত। আমি গতকাল এটিতে সিএফ ২.০ অ্যাপ্লিকেশনটিতে পুনরায় প্রবেশ করেছি।
জেরোদ হাফলিং

0

অবশ্যই আমার কাছে বাগের মতো দেখতে, আপনি যদি প্রতি বার পাঠ্য পরিবর্তনের মাধ্যমে দ্বি-মুখী বাইন্ডিং ব্যবহারের চেষ্টা করতে পারেন এমন ইভেন্টটি উত্থাপন করার চেষ্টা করছেন, দুর্ভাগ্যক্রমে এটি প্রতি-কী প্রেস পরিবর্তন ইভেন্টগুলি উত্থাপন করবে না কেবলমাত্র ক্ষেত্রের ক্ষেত্রে ফোকাস হারায়)। আপনার যদি প্রয়োজন হয় তবে এখানে কাজটি করতে হবে:

        this.textBox1.TextChanged -= this.TextBoxChanged;
        textBlock1.Text += "Text changed " + (counter++) + "\r\n";
        this.textBox1.TextChanged += this.TextBoxChanged;

আমি নিশ্চিত নই যে এটি তার চারপাশে কাজ করবে - সমস্যাটি হ'ল textBlock1.Textপরিবর্তনের কারণে ইভেন্ট হ্যান্ডলার গুলি চালানো নয় - তবে আমি চেষ্টা করে দেখব। ( আমি যে কার্যক্রমের চেষ্টা করতে যাচ্ছিলাম তা হ'ল আমার ইভেন্ট হ্যান্ডলারকে রাষ্ট্রীয় করে তুলতে, আগের পাঠ্যটি মনে রেখে। এটি যদি আসলে পরিবর্তিত না হয় তবে এটিকে এড়িয়ে যান :)
জন স্কিটে

0

অস্বীকৃতি- আমি এক্সএএমএল সূক্ষ্মতার সাথে পরিচিত নই এবং আমি জানি এটি অযৌক্তিক মনে হচ্ছে ... তবে যাইহোক- আমার প্রথম চিন্তাটি টেক্সটচেনডেভেঞ্জারগ্সের পরিবর্তে কেবল সরল ইভেন্টগ্রাফিক্স হিসাবে পাস করার চেষ্টা করা। অর্থবোধ করে না, তবে এটি কি সহায়ক হতে পারে? দেখে মনে হচ্ছে যখন আমি এর আগে ডাবল ফিরিং দেখেছি এটি কোনও ত্রুটির কারণে বা কোনওভাবে 2 পর্দার আড়ালে ইভেন্ট হ্যান্ডলার কল যুক্ত হওয়ার কারণে ঘটে ... আমি নিশ্চিত নই যা কোনটি?

আপনার যদি দ্রুত এবং নোংরা দরকার হয় তবে আমাকে xaml এর সাথে অভিজ্ঞতা না করা হচ্ছে - আমার পরবর্তী পদক্ষেপটি দ্রুত পাঠ্যবাক্স হিসাবে সেই টেক্সটবক্সের জন্য এক্সএএমএল এড়িয়ে যাওয়া হবে ... আপনি যতক্ষণ না বাগটি চিহ্নিত করতে পারবেন বা ঠিক ততক্ষণ এই টেক্সটবক্সটি পুরোপুরি সি # তে করুন কৌশলযুক্ত কোড ... এটির যদি আপনার অস্থায়ী সমাধানের প্রয়োজন হয়।


আমি যে কোনও ইভেন্টের অর্গগুলি পেরিয়ে যাচ্ছি না - আমি ইভেন্ট হ্যান্ডলারটি বাস্তবায়ন করছি। তবে আমি যাচাই করেছি যে সি # তে ইভেন্ট হ্যান্ডলারটি খাঁটিভাবে যুক্ত করা কোনও তাত্পর্যপূর্ণ নয় ... এটি এখনও দু'বার মুছে ফেলা হয়েছে।
জন স্কিটি

ঠিক আছে, হুঁ। হ্যাঁ, এটি যদি খাঁটি সি # হয় তবে এটি বাগের মতো আরও শোনাচ্ছে। প্রথম পরামর্শটি সম্পর্কে - আমি দুঃখিত আমার ক্রিয়াটি ভয়াবহ ছিল, আমার কীভাবে বলা উচিত ছিল- আমি চেষ্টা করব [আপনার বাস্তবায়নে / টেক্সটবক্স চ্যাঞ্জড হ্যান্ডলার পদ্ধতিতে] আরগ্স প্যারামিটারের ধরনটি কেবল সাদামাটা ইভেন্টগারগুলিতে পরিবর্তন করুন। সম্ভবত কাজ করবে না ... তবে আরে ... এটা আমার প্রথম চিন্তা ছিল।
পিম্প জুস ম্যাকজোনস

অন্য কথায়, এটি সম্ভবত কাজ করবে না তবে আমি পদ্ধতিটির স্বাক্ষরটি = প্রাইভেট অকার্যকর টেক্সটবক্সচেন্জড (বস্তু প্রেরক, ইভেন্টআর্গস ই) চেষ্টা করে বলব যে আমি চেষ্টা করেছি =)
পিম্প জুস ম্যাকজোনস

ঠিক আছে। আমি মনে করি না যে এটির কোনও কার্যকর হবে, আমি ভয় করি।
জন স্কিটি

0

আমি মনে করি না এটি একটি বাগ ..

উইন্ডোজ ফর্ম অ্যাপ্লিকেশন এ চেষ্টা করুন, আপনি একটি ত্রুটি পেতে পারে

"সিস্টেম.স্টাক ওভারফ্লো এক্সপ্লেশন 'টাইপের একটি অপরিবর্তিত ব্যতিক্রম সিস্টেম.বাইন্ডোস.ফর্মস.ডিল মধ্যে ঘটেছে"


প্রশ্নটি থেকে: "আমি স্রেফ একটি পাঠ্যবক্স এবং একটি পাঠ্যবন্ধকে স্ট্যান্ডার্ড ইউআই টেমপ্লেটে যুক্ত করেছি" - তারা একই জিনিস নয়। আমি একটি পাঠ্যবক্স পেয়েছি যা ব্যবহারকারী টাইপ করতে পারে এবং একটি পাঠ্যব্লক যা গণনা প্রদর্শন করে।
জন স্কিটি

0

স্টেফানউইক ঠিক আছে, এই টেম্পলেটটি ব্যবহার করে বিবেচনা করুন

<Application.Resources>
        <ControlTemplate x:Key="PhoneDisabledTextBoxTemplate" TargetType="TextBox">
            <ContentControl x:Name="ContentElement" BorderThickness="0" HorizontalContentAlignment="Stretch" Margin="{StaticResource PhoneTextBoxInnerMargin}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="Stretch"/>
        </ControlTemplate>
        <Style x:Key="TextBoxStyle1" TargetType="TextBox">
            <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilyNormal}"/>
            <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}"/>
            <Setter Property="Background" Value="{StaticResource PhoneTextBoxBrush}"/>
            <Setter Property="Foreground" Value="{StaticResource PhoneTextBoxForegroundBrush}"/>
            <Setter Property="BorderBrush" Value="{StaticResource PhoneTextBoxBrush}"/>
            <Setter Property="SelectionBackground" Value="{StaticResource PhoneAccentBrush}"/>
            <Setter Property="SelectionForeground" Value="{StaticResource PhoneTextBoxSelectionForegroundBrush}"/>
            <Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/>
            <Setter Property="Padding" Value="2"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TextBox">
                        <Grid Background="Transparent">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates" ec:ExtendedVisualStateManager.UseFluidLayout="True">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="MouseOver"/>
                                    <VisualState x:Name="Disabled">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="EnabledBorder">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Collapsed</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="ReadOnly">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="EnabledBorder">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Collapsed</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="FocusStates">
                                    <VisualState x:Name="Focused">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="EnabledBorder">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneTextBoxEditBackgroundBrush}"/>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="EnabledBorder">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneTextBoxEditBorderBrush}"/>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Unfocused"/>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <VisualStateManager.CustomVisualStateManager>
                                <ec:ExtendedVisualStateManager/>
                            </VisualStateManager.CustomVisualStateManager>
                            <Border x:Name="EnabledBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Margin="{StaticResource PhoneTouchTargetOverhang}">
                                <ContentControl x:Name="ContentElement" BorderThickness="0" HorizontalContentAlignment="Stretch" Margin="{StaticResource PhoneTextBoxInnerMargin}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="Stretch"/>
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Application.Resources>

0

এটি একটি পুরানো বিষয়, তবে পরিবর্তনের টেম্পলেটটির পরিবর্তে (এটি আমার পক্ষে কাজ করে না, আমি ব্লেন্ডের সাথে অন্য পাঠ্যবক্সটি দেখতে পাচ্ছি না) ইভেন্টটি ইতিমধ্যে ফাংশনটি করেছে কিনা তা পরীক্ষা করতে আপনি বুলিয়ান যুক্ত করতে পারেন।

boolean already = false;
private void Tweet_SizeChanged(object sender, EventArgs e)
{
    if (!already)
    {
        already = true;
        ...
    }
    else
    {
    already = false;
    }
}

আমি সচেতন যে সঠিক উপায় নয়, তবে আমি মনে করি এটি করার সহজ উপায়। এবং এটি কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.