This will show how to do cross dissolve blending between idle and walk.
    // Add this as a member variable
    float blendFactor = 0;
    // Add this to the beginning of the if (state=="idle") block in the UpdateState method
    // Remove the old if (keyState.IsKeyDown(Keys.W)) block
    if (keyState.IsKeyDown(Keys.W))
    {
        blendFactor = 0;
        state = "idleToWalk";
    }
    // Add this to the beginning of the if (state=="walk") block in the UpdateState method
    // Remove the old if (keyState.IsKeyUp(Keys.W)) block
    if (keyState.IsKeyUp(Keys.W))
    {
        blendFactor = 0;
        state = "walkToIdle";
    }
    // Add this to the UpdateState method
    else if (state == "idleToWalk")
    {
        blendFactor += .1f;
        currentSpeed = blendFactor * WALK_SPEED;
        if (blendFactor >= 1)
        {
            blendFactor = 1;
            state = "walk";
        }
        foreach (BonePose p in poses)
        {
            p.CurrentController = idle;
            p.CurrentBlendController = walk;
            p.BlendFactor = blendFactor;
        }
    }
    // Add this to the UpdateState method
    else if (state == "walkToIdle")
    {
        blendFactor += .1f;
        currentSpeed = (1f-blendFactor) * WALK_SPEED;
        if (blendFactor >= 1)
        {
            blendFactor = 1;
            state = "idle";
        }
        foreach (BonePose p in poses)
        {
            p.CurrentController = walk;
            p.CurrentBlendController = idle;
            p.BlendFactor = blendFactor;
        }
    }